what‘s 计算属性

385 阅读2分钟

what‘s 计算属性

Vue官方文档中,对计算属性如此解释

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。在这个地方,模板不再是简单的声明式逻辑。

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

用2句话概括:

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,都应使用计算属性。

computed简单使用

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})

computed VS methods

当然,我们可以将同一函数定义为一个方法methods而不是一个计算属性computed,并且两种方式的最终结果确实是完全相同的。

那他们到底有什么不同呢?

不同的是计算属性computed是基于它们的响应式依赖进行缓存的——只在相关响应式依赖发生改变时它们才会重新求值!

相比之下,每当触发重新渲染时,调用方法methods总会再次执行函数。

计算属性computed的结果会被缓存,除非依赖的响应式 property 变化才会重新计算。注意,如果某个依赖 (比如非响应式 property) 在该实例范畴之外,则计算属性是不会被更新的。

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

get & set

计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。

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

// ...
computed: {
  fullName: {
    // getter 只读属性
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter 编辑属性
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
// ...

计算属性禁用箭头函数

注意如果你为一个计算属性使用了箭头函数,则 this 不会指向这个组件的实例,不过你仍然可以将其实例作为函数的第一个参数来访问。当然并不推荐这样做!

×错误用法:

computed: {
  aDouble: vm => vm.a * 2
}