Vue中的computed计算属性和methods的区别

记录一下今天学习的计算属性相关的东西。

计算属性的语法格式是:computed: {}

计算属性

计算属性一般是为了简化模板中的内容,让模板中内容尽可能简洁。如果我们将太多的逻辑写在模板中,模板将会变得难以维护。例如:

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

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

<body>
  <div id="app">
    {{fullName}}
    <!-- {{fullName()}}  方法使用的,因为方法需要调用! -->
    {{age}}
  </div>
  <script>
    var app = new Vue({
      el:'#app',
      data:{
        firstName:'Dell',
        lastName:'Lee',
        age: 28
      },
    // 计算属性完成名字的组合(有缓存,更推荐)
    // 自带缓存,如果相关的值没有改变,改变页面其他元素的值,不需要重新计算
    computed: {
      fullName(){
        console.log('计算了一次');
        return this.firstName + ' ' + this.lastName;
      }
    },
    // 方法完成名字的组合(无缓存)
    // 方法内部没有缓存机制,相关的值即便没有改变,刷新页面时仍旧需要重新计算
    // methods: {
    //   fullName(){
    //     console.log('计算了一次');
    //     return this.firstName + ' ' + this.lastName;
    //   }
    // },
    })
  </script>

你应该发现了fullName更像一个方法,而不像一个属性。这是因为计算属性的简写方式导致,不是它的原始样子,原始样子如下:

<script>
 computed: {
        fullName:{
          get(){
            return this.firstName +' '+this.lastName;
          },
        }
      },
</script>

计算属性默认只有get方法,当只有get方法时,就可以进行简写。

当然,如果有需要,我们可以为计算属性提供它的set方法,set方法在计算属性的值被修改时自动调用。这里主要先理解下get方法。

通常情况下,我们只会用到get方法,所以简写形式居多,但不要把它当做方法。它跟方法是不一样的,方法的每次调用,方法内部逻辑都会执行一遍。计算属性却不会,它具备基于依赖的缓存能力。下面例子来证实这个现象。


<div id="app">
  <div>{{reverseMsg}}</div>
  <div>{{reverseMsg}}</div>
  <hr>
  <div>{{reverseStr(msg)}}</div>
  <div>{{reverseStr(msg)}}</div>
</div>

<script>
  let vm = new Vue({
    el: '#app',
    data: {
      msg: 'Hello'
    },
    computed: {
      reverseMsg() {
        console.log('computed')
        return this.msg.split('').reverse().join('')
      }
    },
    methods: {
      reverseStr() {
        console.log('method')
        return this.msg.split('').reverse().join('')
      }
    }
  })
</script>

上面代码中,计算属性在模板中使用了两次,方法调用也使用了两次,打印发现

在这里插入图片描述
方法中的打印语句执行了两次,而计算属性中的打印语句却只执行了一次。这就验证了,计算属性的简写形式虽然长得跟方法一模一样,但它确实不是方法。

总结:
方法的每次调用,方法内部逻辑都会执行一遍。计算属性却不会,它具备基于依赖的缓存能力

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁锤妹妹@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值