3.1 什么是计算属性
在上一篇博文中,我们已经可以搭建出一个简单的Vue应用,在模板中双向绑定一些数据或表达式了。但是表达式如果过长,或逻辑更为复杂时,就会变得臃肿甚至难以维护,比如:
<div>
{{text.split(',')}}.reverse().join(',')
</div>
这里的表达式分为三个操作,并不是很清晰,所以在遇到复杂的逻辑时应该使用计算属性。上例可以用计算属性进行改写:
body>
<div id='app'>
{{reversedText}}
</div>
<script src="img/js/vue.js"></script>
<script>
var app=new Vue({
el:'#app',
data:{
text:'123,456'
},
computed:{
reversedText:function(){
//这里的this指向的是当前Vue实例
return this.text.split(',').reverse().join(',');
}
}
});
</script>
</body>
所有的计算属性都以函数的形式写在Vue实例内的Computed选项内,最终返回计算后的结果。
3.2 计算属性用法
在一个计算属性里可以完成各种复杂的逻辑,包括运算,函数调用等,只要最终返回一个结果就可以。除了上例简单的用法,计算属性还可以依赖多个Vue实例的数据,只要其中任意数据变化,计算属性就会重新执行,视图也会更新,下面的事例是购物车两个包裹的物品总价:
<body>
<div id="app">
总价:{{prices}}
</div>
<script src="img/js/vue.js"></script>
<script>
var app=new Vue({
el:'#app',
data:{
package1: [
{
name :'iphonex',
price:7199,
count:2
},
{
name :'Ml6',
price:1999,
count:1
}
],
package2:[
{
name :'mate10',
price:3199,
count:4
},
{
name :'MX7',
price:2199,
count:5
}
]
},
computed: {
prices:function() {
var prices=0;
for(var i=0;i<this.package1.length;i++){
prices += this.package1[i].price*this.package1[i].count;
}
for(var i=0,i<this.package2.length;i++){
prices += this.package2[i].price()*this.package2[i].count;
}
return prices;
}
}
});
</script>
</body>
每一个计算属性都包含一个getter和setter,上面的例子只是利用了getter来读取,当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter函数,执行一些自定义操作,例如:
<body>
<div id="app">
姓名:{{fullName}}
</div>
<script src="img/js/vue.js"></script>
<script>
var app=new Vue({
el:'#app',
data:{
firstName:'许',
lastName:'晨'
},
computed: {
fullName:{
//getter用于接收
get:function(){
return this.firstName +' '+this.lastName;
},
set:function(newValue){
var names=newValue.split(' ');
this.firstName=names[0];
this.lastName=names[names.length-1];
}
}
}
});
</script>
</body>
当执行app.fullName=’许 晨’时,setter就会被调用,数据firstName和lastName都会被更新,视图同样也会被更新,绝大多数情况下,我们只会用默认的getter方法来读取一个计算属性,在业务中很少用到Settter,所以在声明一个计算属性的时候,可以直接使用默认的写法,不必将getter和setter都声明,计算属性除了上例简单的文本插值外,还经常用于动态设置元素的样式名称class和内联样式style,当使用组件时,计算属性也常来用来传递props。
计算属性有两个很实用的小技巧。一是计算属性可以依赖其他计算属性,二是计算属性不仅可以依赖当前Vue实例的数据,还可以依赖其他实例的数据。
我们写的组件所用到的数据需要依赖别人的组件提供。
3.3 计算属性缓存
计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,它才会重新取值。使用计算属性还是methods取决于是否需要缓存,当遍历大数组和做大量计算的时候,应当使用计算属性,除非你不希望得到缓存。