计算属性和监听器

计算属性和监听器

一般情况下都是放到 data 中的,但是有些属性可能需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性,比如:

<div id="app">        
	<label>长:</label>        
	<!-- v-model 双向绑定 -->        <input type="number" name="length" v-model:value="length">        
	<label>宽:</label>        
	<input type="number" name=" width" v-model:value=" width">        
	<label>面积:</label>        
	<!-- readonly 只读 -->        
	<input type="number" readonly v-bind:value="area">
    </div>
<script>    
	new Vue({        
		el: "#app",        
		data:{            
			length:0,            
			width:0        
			},        
		// 计算属性        
		computed:{            area:function(){                
			console.log(this.length, this.width)                
			return this.length * this.width            
			}        
		}   
})</script>    

计算属性更加只能,它是基于她们得响应式依赖进行缓存得,也就是说只要相关依赖(比如上例的 area)没有发生变化,那么这个计算属性的函数不会重新执行,而是直接返回之前的值。这个缓存功能让计算属性访问更加高效。

计算属性的 set

计算属性默认只有get,不过在需要时你也可以提供一个set,但是提供了set 就必须提供get方法。例子:

 <div>            
 <label>省:</label>            
 <input type="text" v-model:value="province">        
 </div>        
 <div>            
 <label>市:</label>            
 <input type="text" v-model:value="city">        
 </div>        
 <div>            
 <label>区:</label>            
 <input type="text" v-model:value="area">        
 </div>        
 <div>            
 <label>详细地址:</label>            
 <input type="text" v-model:value="addr">        
 </div>

 new Vue({        
	 el: "#app",        
 	data:{            
 		province: "",           
 		 city: "",            
 		 area: ""
       	 },
	
	addr:{            
		get:function(){                
		 	var result = ""                
		 	if(this.province){                    
		 		result = this.province + "省"                
		 		}                
		 	if(this.city){                    result += this.city + "市"                
		 		}               
		 	if(this.area){                    result += this.area + "区"                
		 		}                
		 	return result            
		 	},            
		set:function(value){                
		 			
		     console.log(value)                
		 			
                      var result = value.split(/||/)                
                      console.log(result)                
                      if(result && result.length > 0){                    
                      	 this.province = result[0]                
                      	 }                
                      if(result && result.length > 1){                    
                          this.city = result[1]               
                           }                
                      if(result && result.length > 2){                    
                         this.area = result[2]                
                 }            
              }

监听器

监听属性可以针对某个属性进行监听,只要这个属性的值发生改变,那么就会执行相应的函数。

<div>
	<label>搜索:</label>        
	<input type="text" v-model:value="keyword">        
	<p>结果:</p>        
	{{answer}}
</div>

<script>    
	new Vue({       
	     el: "#app",       
	     data:{
	      keyword:"",            
	      answer:""
        },
        watch:{            
           keyword: function(newvalue,oldvalue){                
                         console.log(newvalue)                
                         console.log(oldvalue)                
                         this.answer= "加载中。。。。"                
                         // 定时器 时间前也可加Math.random()-->随机                
                         setTimeout(() => {                   
                          this.answer = "搜索结果:" +newvalue                
                          }, Math.random()*1000);           
            }        
         }    
    })
 </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值