先说说对官网上“计算属性”的理解:
为啥要利用计算属性?
是为了来应对复杂计算的挑战,一般情况下,对于简单的模板,因为逻辑比较简单,所以就直接用就行了,但是如果要对模板中的表达式做复杂的处理,而且要用到多个地方,如果直接写将会很复杂,而且也不利于维护,所以“计算属性”就是为了解决这个问题而生的(个人观点)
先看代码:Html部分
JS部分
var vm = new Vue({
el:"#containBox",
data:{
datas:"这就是我,不一样的花朵!",
greetings:"hello,Vuejs,it is my pleaure to meet you!"
},
methods:{
slicefunction:function(){
return this.greetings.toUpperCase()
}
},
//声明了一个计算属性slicefun,
computed:{
slicefun:function(){
// return this.greetings.toUpperCase()
return this.greetings.toUpperCase()
},
date:function(){
return Date.now()
}
}
})
"你可以像绑定普通属性一样在模板中绑定计算属性。 Vue 知道 vm.slicefun
依赖于 vm.greetings
,因此当 vm.greetings
发生改变时,所有依赖于 vm.slicefun
的绑定也会更新。"
Vue 知道 vm.slicefun
依赖于 vm.greetings,
因为在slicefun里面有greetings,所以会有依赖;
"不同的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。这就意味着只要greetings',还没有发生改变,多次访问slicefun 计算属性会立即返回之前的计算结果,而不必再次执行函数。而methods是运行一次计算一次,
关于计算属性和methods,根据官网的总结,如果你不想想用缓存,那就请用method,如果你想用缓存,那就请用计算属性
利用缓存,我们可以提高写性能,尤其是在处理大量计算的时候更是如此,利用缓存我们也许只需要计算一次,但是不利用缓存我们就需要每次都计算,这样就严重影响了前端性能;
其实,在这里,你会发现其实这个时候,这个时候的compute好像有局限性--那就是只能返回(get),不能设置(set),然而在现实的应用中,更多的是返回和设置共存的,这里也就要谈到计算属性里面的getter和setter了;
其实,compute中的getter就是用来确定计算属性的值到底是多少,而setter就是来设置的,setter的回调函数在计算属性发生改变的时候才会调用,
以下是具体的案例:
{{fullname}}
{{firstname}}
{{lastname}}
{{fullname1}}
JS部分
computed:{
slicefun:function(){
// return this.greetings.toUpperCase()
return this.greetings.toUpperCase()
},
date:function(){
return Date.now()
},
fullname:{
// setter,当fullname发生改变的时候触发
set:function(val){
console.log(val)
// 在set函数中,形参代表着fullname的新值
var names = val.split(" ");
this.firstname = names[0];
this.lastname = names[names.length-1]
},
// getter,这里是用来确定fullname的值到底是谁的,当fullname发生改变的时候之所以{{fullname}}会发生改变,
// 主要就是因为fullname发改变会触发set函数,导致this.firstname 和 this.lastname发生改变,所以在get函数中,
// 就会导致name1发生改变,最终导致返回值改变,fullname也就发生了改变
get:function(){
//console.log(name1)
var name1 = this.firstname + " " + this.lastname
return name1
}
},
//在刷新的时候会正常的返回fullname,但是在改变fullname1的时候,就会报错,因为没有setter,就不知道该如何处理this.datas
//所以当然也就返回不了datas了
fullname1:function(){
return this.datas;
}
}
Vue 通过 watch 选项提供一个更通用的方法,来响应(监控)数据的变化。
先上实例吧:
{{str}}
{{num}}
{{obj.tel}}
{{book}}
JS部分
var vm = new Vue({
el:"#VueRooter",
data:{
str:" hello VueJS!",
num:5,
judge:true,
obj:{
tel:13578932131
},
book:"这是一本好书"
},
methods:{
changeNum:function(){
return this.num-3
},
changestr:function(val,oldVal){
console.log(val,oldVal)
}
},
/*Vue 通过 watch 选项提供一个更通用的方法,来响应(监控)数据的变化。*/
watch:{
// 监控str这个表达式,当其发生变化的时候执行changestr这个方法,这个方法是定义在methods里面的
str:"changestr",
// 监控num表达式,当其发生变化的时候执行回调函数,其中的形参val,代表变化后的值,old代表变化前的值
num:function(val,oldval){
var str = "新的数字是:"+ val +"旧的数字是:"+oldval
// return str;
console.log(str)
},
// 监控对象中的表达式tel的变化,注意不能写成obj.tel,会报错的
"obj.tel":function(val,oldVal){
console.warn("change!")
},
// 监控book
book:{
// 是否是深度,说实话不怎么理解什么意思
deep:true,
// 变化的时候要做的事情,一定是handler,不能随意命名
handler:function(val,oldval){
console.log("我是新的"+val,"我是旧的"+oldval)
}
}
}
})
//vm.str = "dadadadasdasdsada"