初识Vue.js(三)

Vue.js 同时被 2 个专栏收录
9 篇文章 0 订阅

3.1 什么是计算属性

数据监听watch计算属性computed
watch监听单个,computed监听多个

当watch监听的是复杂数据类型的时候需要做深度监听(写法如下)

watch:{
            msg:{
              handler(val){
               if(val.text=='love'){
                alert(val.text)
               }
              },
              deep:true//开启深度监听
            }
          }

computed 监视对象,写在了函数内部, 凡是函数内部有this.相关属性,改变都会触发当前函数。

在上一篇博文中,我们已经可以搭建出一个简单的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取决于是否需要缓存,当遍历大数组和做大量计算的时候,应当使用计算属性,除非你不希望得到缓存。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值