Vue(5)计算属性computed

Vue(5)计算属性computed前言一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:<divid="example&quot

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性。
 

基础例子

<div id="app">
  <h2>总价格:{{totalPrice}}</h2>
</div>
<script>
  const vm = new Vue({
    el: "#app",
    data: {
      message: "hello",
      books: [
        {name: '三国演义', price: 30},
        {name: '红楼梦', price: 40},
        {name: '西游记', price: 50},
        {name: '水浒传', price: 60},
      ],
    },
    computed: {
      // 计算属性的 getter
      totalPrice: function (){
          let result = 0;
          // `this` 指向 vm 实例
          for (let book of this.books){
            result += book.price;
          }
          return result
      }
    }
  })
</script>

结果:总价格:180

这里我们声明了一个计算属性 totalPrice。然后通过for循环计算出书的总价,像这种需要计算的属性,就写在computed中。

属性一般都有getset两个方法,get获取属性值,set设置属性值,computed中默认就是get属性,我们的vm.totalPrice是依赖于books.price,如果书本的价格发生变化,那么计算属性totalPrice也随之动态变化
 

计算属性缓存 vs 方法

你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果:

<div id="app">
  <h2>总价格:{{getAllPrice()}}</h2>
</div>
<script>
  const vm = new Vue({
    el: "#app",
    data: {
      message: "hello",
      books: [
        {name: '三国演义', price: 30},
        {name: '红楼梦', price: 40},
        {name: '西游记', price: 50},
        {name: '水浒传', price: 60},
      ],
    },
    methods: {
      getAllPrice: function () {
        let result = 0;
        // `this` 指向 vm 实例
        for (let book of this.books){
          result += book.price;
        }
        return result
      }
    },
  })
</script>

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 books 还没有发生改变,多次访问 totalPrice 计算属性会立即返回之前的计算结果,而不必再次执行函数。

所以说计算属性是有缓存的

我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。
 

计算属性的 setter

计算属性默认只有 getter,不过在需要时你也可以提供一个 setter

computed: {
  totalPrice: {
    get: function () {
      let result = 0;
      // `this` 指向 vm 实例
      for (let book of this.books){
        result += book.price;
      }
      return result
    },
    set: function (newValue) {
      for (let book of this.books){
        book.price += 10
      }
    }
  }
}

这里我们添加了set方法,在运行vm.totalPrice=[...]时,setter 会被调用,随后书本的总价格也会随之变化,但是一般情况下不会使用set

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164866.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一代、二代、三代测序技术原理与比较「建议收藏」

    一代、二代、三代测序技术原理与比较「建议收藏」从1977年第一代DNA测序技术(Sanger法)1,发展至今三十多年时间,测序技术已取得了相当大的发展,从第一代到第三代乃至第四代,测序读长从长到短,再从短到长。虽然就当前形势看来第二代短读长测序技术在全球测序市场上仍然占有着绝对的优势位置,但第三和第四代测序技术也已在这一两年的时间中快速发展着。测序技术的每一次变革,也都对基因组研究,疾病医疗研究,药物研发,育种等领域产生巨大的推动作用。在这里我主要对当前的测序技术以及它们的测序原理做一个简单的小结。

    2022年5月17日
    90
  • 《javascript高级程序设计》笔记:对象数据属性和访问器属性

    《javascript高级程序设计》笔记:对象数据属性和访问器属性

    2022年3月8日
    46
  • 2022.01idea激活码[最新免费获取]

    (2022.01idea激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    151
  • 惠普电脑蓝屏开不了机怎么解决_hp服务器售后电话800

    惠普电脑蓝屏开不了机怎么解决_hp服务器售后电话800在日常生活中,电脑出现蓝屏的无法启动的问题很常见,怎么处理电脑蓝屏问题呢?下面是小编为大家整理的关于hp电脑蓝屏后无法启动的相关资料,希望对您有所帮助!hp电脑蓝屏后无法启动的解决方法很多时候电脑蓝屏是因为电脑的硬件,电脑关机完成后,我们可以断开电脑的电源,然后对我们的内存条擦拭后,从新装机到我们的电脑主板上。清理电脑的各项主板接口也是必须的,我们可以根据顺序,依次清理电脑的各个接口,完成后即可。…

    2022年8月13日
    1
  • 无锡梅里旅游策划方案——中国第一锡宫!

    无锡梅里旅游策划方案——中国第一锡宫!无锡梅里旅游策划方案——中国第一锡宫!熊大寻旅游策划公司/文无锡梅里古都”,位于无锡新区梅村,是吴文化的发祥地。梅村古名梅里,早在三千二百多年前,西周周太王长子泰伯,为达成父王想立三子季历的愿望,偕二弟仲雍托辞采药,夜奔江南,拴马于枯树桩。到清早,见枯枝上梅花朵朵,喜出望外,顿悟此地当为宝地。于是为其取“梅里”之名,定居于此。勾吴之国,由此发端。因泰伯三让两家天下,孔子称其为“至德”,司马迁的…

    2022年6月1日
    32
  • angular7 父组件向子组件传值

    angular7 父组件向子组件传值1.新建子组件app-child2.在父组件中引用子组件<app-child[value1]=”fatherValue”></app-child>2.在子组件中使用@Input接受父组件传的值@Input()value1:string;value1就是父组件传到子组件的值了,可以在子组件中去使用…

    2022年6月5日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号