1、什么是计算属性javascript
模板内的表达式很是便利,可是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板太重且难以维护。vue
2、计算属性的用法java
在一个计算属性里能够完成各类复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就能够。数组
<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: { reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } });
结果: Original message: "Hello" Computed reversed message: "olleH"
除了上例简单的用法,计算属性还能够依赖多个Vue 实例的数据,只要其中任一数据变化,计算属性就会从新执行,视图也会更新。缓存
计算属性还有两个很实用的小技巧容易被忽略:一是计算属性能够依赖其余计算属性; 二是计算属性不只能够依赖当前Vue 实例的数据,还能够依赖其余实例的数据,例如:app
<div id="app1"></div> <div id="app2">{{ reverseText}}</div>
var app1 = new Vue({ el: '#app1', data: { text: 'computed' } }); var app2 = new Vue({ el: '#app2', computed: { reverseText: function(){ return app1.text.split('').reverse().join(''); //使用app1的数据进行计算 } } });
每个计算属性都包含一个getter 和一个setter ,咱们上面的两个示例都是计算属性的默认用法, 只是利用了getter 来读取。函数
在你须要时,也能够提供一个setter 函数, 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter 函数,执行一些自定义的操做,例如:性能
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
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];
}
}
}
});
//如今再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新。
绝大多数状况下,咱们只会用默认的getter 方法来读取一个计算属性,在业务中不多用到setter,因此在声明一个计算属性时,能够直接使用默认的写法,没必要将getter 和setter 都声明。this
3、计算属性缓存 spa
咱们能够将同一函数定义为一个方法而不是一个计算属性,两种方式的最终结果确实是彻底相同的。只是一个使用reverseTitle()取值,一个使用reverseTitle取值。
然而,不一样的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会从新求值。
这就意味着只要 title尚未发生改变,屡次访问 reverseTitle计算属性会当即返回以前的计算结果,而没必要再次执行函数。
<div>{{reverseTitle()}}</div>
// 在组件中 methods: { reverseTitle: function () { return this.title.split('').reverse().join('') } }
你可能已经注意到咱们能够经过在表达式中调用方法来达到一样的效果,咱们能够将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是彻底相同的。然而,不一样的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会从新求值。这就意味着只要 message
尚未发生改变,屡次访问 reversedMessage
计算属性会当即返回以前的计算结果,而没必要再次执行函数。(缓存的效果)这也一样意味着下面的计算属性将再也不更新,由于 Date.now()
不是响应式依赖:
computed: { now: function () { return Date.now() } }
相比之下,每当触发从新渲染时,调用方法将总会再次执行函数。
咱们为何须要缓存?假设咱们有一个性能开销比较大的的计算属性 A,它须要遍历一个巨大的数组并作大量的计算。而后咱们可能有其余的计算属性依赖于 A 。若是没有缓存,咱们将不可避免的屡次执行 A 的 getter!若是你不但愿有缓存,请用方法来替代。
注意,不该该使用箭头函数来定义计算属性函数 (例如 aDouble: () => this.a * 2
)。理由是箭头函数绑定了父级做用域的上下文,因此 this
将不会按照指望指向 Vue
实例,this.a
将是 undefined
。
固然有不少this须要指向vue实例的时候,都须要慎用箭头函数。