想看上一节请点击上面的链接。
这一节我们要学习的是计算属性
在模板中双向绑定一些数据或表达式,会出现表达式过长,或者罗竞技较为复杂,就会变得臃肿甚至难以阅读和维护。
<div>
{{ text.spilt(',').reverse().join(',')}}
</div>
这里的表达式含三个操作,并不是很清晰,所以遇到复杂的逻辑时应该使用计算属性。
接下来咱们对上面的例子用计算属性进行改写:
computed:{
reversedText:function(){
// 这里的this指向的是当前的Vue实例
return this.text.spilt(',').reverse().join(',');
}
}
注意,所有的计算属性都以函数的形式写在Vue实例内的computed选项内,最终返回计算后的结果。
计算属性用法
在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以。除了上例简单的用法,计算属性还可以依赖多个Vue实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。
下面展示购物车两个物品的总价:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 示例</title>
</head>
<body>
<div id="app">
总价:{{ prices }}
</div>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
package1:[
{
name:'iPhone7',
price:7199,
count:2
},
{
name:'iPad',
price:2888,
count:1
}
],
package2:[
{
name:'apple',
price:3,
count:5
},
{
name:'banana',
price:2,
count:10
}
],
},
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>
</html>
当package1或者package2中的商品有任何变化,比如购买数量变化或者增删商品时,计算属性prices就会自动更新,视图的总价也会自动变化。
每一个计算属性都包含一个getter和一个setter,我们上面的两个实例都是计算属性二点默认用法,只是利用了getter来读取。在你需要时,就会触发setter函数,执行自定义操作,思考了一下还是展示一段代码来说明一下这个问题吧:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 示例</title>
</head>
<body>
<div id="app">
姓名:{{ fullName }}
</div>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
firstName:'Jack',
lastName:'Green'
},
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];
}
}
}
})
</script>
</body>
</html>
当执行app.fullName = 'Jack Doe'时,setter就会被调用,数据firstName和lastName都会相对更新,视图同样也会更新。
绝大多数情况下,我们只会弄人用getter方法来获取getter方法来读取一个计算属性,在业务中很少用奥setter,所以在声明一一个计算属性时,可以直接使用默认的写法,不必将getter和setter 都声明。
扩展:计算属性有两个很实用的小技巧,一是计算属性可以依赖其他的计算属性;二是计算属性不仅可以依赖当前Vue实例的数据,还可以依赖其他实例的数据。
var app1 = new Vue({
el:'#app1',
data {
text:'123,456'
}
});
var app2 = new Vue({
el:'#app2',
computed {
reversedText:function(){
// 这里依赖的是实例app1的数据text
retrun app1.text.split(',').reverse().join(',');
}
}
});
这里我们创建了两个 Vue 实例 appl 和 app2, 在 app2 的计算属性 reversedText 中,依赖的是 appl 的数据 text,所以当 text 变化时,实例 app2 的计算属性也会变化。这个在以后的生产中常用于多人合作。
计算属性缓存
我们不难发现,调用methods里的方法也可以与计算属性起到同样的作用,甚至该方法还能接收参数,使用起来更加灵活。计算属性是基于它的依赖缓存的。一个计算属性所依赖的数据发生变化时,他才 会发生变化,重新取值,所以只要text不改变,计算属性就不会更新。
computed: {
now : function () {
return Date.now();
}
}
这里的 Date.now()不是响应式依赖,所以计算属性 now 不会更新。但是 methods 则不同,只要 重新渲染,它就会被调用,因此函数也会被执行。
使用计算属性还是 methods 取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用 计算属性,除非你不希望得到缓存。
这里是不是看的很晕,不过还好了,实现一下这个实例,就明白了。
第三节的结束了,接下来就是第四节了