Vue.js实战之系统学习第三节

Vue.js实战之系统学习第二节

想看上一节请点击上面的链接。

这一节我们要学习的是计算属性

在模板中双向绑定一些数据或表达式,会出现表达式过长,或者罗竞技较为复杂,就会变得臃肿甚至难以阅读和维护。

<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 取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用 计算属性,除非你不希望得到缓存。

这里是不是看的很晕,不过还好了,实现一下这个实例,就明白了。

第三节的结束了,接下来就是第四节了

Vue.js实战之系统学习第四节

猜你喜欢

转载自blog.csdn.net/weixin_41530824/article/details/88532383