????????模板内的表达式用于简单的运算,当遇到逻辑复杂的运算的时候就会难以维护。计算属性和监听属性去解决该问题。
<div id="element">
<p>原字符串:{{str}}</p>
<p>新字符串:{{newstr}}</p>
</div>
<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
var demo = new Vue({
el: '#element',
data: {
str: 'Hello * World * !'
},
computed:{
newstr:function(){
return this.str.split('*').join('+');//对字符串进行分割并重新连接
}
}
})
</script>
//'Hello * World * !
//'Hello + World + !
? ? ? ? 模板当中声明了一个newstr计算属性依赖于str属性,当str发生变化的时候,newstr属性的值也会自动更新。
????????每一个计算属性都包含一个getter和setter。当没有指明方法时,默认使用getter方法来读取数据,getter用来执行读取操作,而setter用来执行设置值的操作,当手动更新时就会触发setter,并触发视图更新。
<div id="element">
<p>姓名:{{fullname}}</p>
</div>
<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
var demo = new Vue({
el: '#element',
data: {
name1: '法外狂徒',
name2: '张三'
},
computed:{
fullname:{
//getter
get : function(){
return this.name1+this.name2;
},
//setter
set:function(value){
this.name1=value.substr(0,4);
this.name2=value.substr(4)
}
}
}
})
demo.fullname='法外狂徒———————————张三'
</script>
//法外狂徒———————————张三
? ? ? ? 计算属性computed和methods可以实现完全是一样的效果。他们有什么区别呢?
<div id="element">
<input v-model="message">
<p>methods方法:{{getTimeA()}}</p>
<p>computed方法:{{getTimeB}}</p>
</div>
<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
var demo = new Vue({
el: '#element',
data: {
message:''
},
computed:{
getTimeB:function(){
var hour=new Date().getHours();
var minute=new Date().getMinutes();
var second=new Date().getSeconds();
return hour+":"+minute+":"+second;
}
},
methods:{
getTimeA:function(){
var hour=new Date().getHours();
var minute=new Date().getMinutes();
var second=new Date().getSeconds();
return hour+":"+minute+":"+second;
}
}
})
</script>
//method方法:11:16:35
//computed方法:11:16:13
?上面代码,vue实例发生变化的时候就会重新渲染
? ? ? ? 监听属性是Vue.js提供的一种用来监听和响应Vue实例中的数据变化的方式。在监听数据对象中属性时,都会执行特定的操作。监听属性可以定义在Vue实例选项之中,也可以使用实例方法xx.$watch()
<div id="element">
<input v-model="name">
</div>
<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
var demo = new Vue({
el: '#element',
data: {
name:'法外狂徒张三'
},
watch:{
name:function(newValue,oldValue){
alert("原值:"+oldValue+"新值:"+newValue)
}
}
})
//使用xxx.$watch
// demo.$watch('name',function(newValue,oldValue){
// alert("原值:"+oldValue+"新值:"+newValue)
// })
</script>
?????????deep选项,如果要监听的属性是一个对象,为了监听对象内布值的变化,可以在选项参数中设置deep:true。?
<div id="element">
</div>
<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
var demo = new Vue({
el: '#element',
data: {
dogs:{
name:'雄文岸田',
sex:'gay',
hobby:'e.a.t s.h.i.t'
}
},
watch:{
dogs:{
handler:function(val){
alert("新值:"+val.name+"-"+val.sex+"-"+val.hobby)
},
deep:true
}
}
})
demo.dogs.name='文雄岸田'
</script>
????????看到最后,可以结合MVVM 模式、Vue 双向绑定原理加以理解,observe的任务就是对Data属性加上setter和getter,一旦数据发生变化就会触发监听回调,达到双向绑定的目的。
参考文献: