监视属性
有两种形式
-
const vm = new Vue({ el:'#root', data: { isHot:true }, computed:{ info(){ return this.isHot?"炎热":"凉爽" } }, methods: { changeWeather(){ this.isHot = !this.isHot } }, watch:{ isHot:{ immediate:true, handler(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } } } })
-
const vm = new Vue({ el:'#root', data: { isHot:true }, computed:{ info(){ return this.isHot?"炎热":"凉爽" } }, methods: { changeWeather(){ this.isHot = !this.isHot } }, }) vm.$watch('info',{ immediate:true, handler(newValue,oldValue){ console.log('info被修改了',newValue,oldValue) } }) </script>
深度监视
-
Vue中的watch默认不监测对象内部值的改变(一层)
-
配置deep:true可以监测对象内部值改变(多层)
<body> <div id="root"> <h2>今天天气很{{info}}</h2> <button @click="changeWeather">点击切换天气</button> <h3>a的值是:{{numbers.a}}</h3> <button @click="numbers.a++">点我让a+1</button> <h3>b的值是:{{numbers.b}}</h3> <button @click="numbers.b++">点我让b+1</button> </div> <script> const vm = new Vue({ el:'#root', data: { isHot:true, numbers:{ a:1, b:1 }, }, computed:{ info(){ return this.isHot?"炎热":"凉爽" } }, methods: { changeWeather(){ this.isHot = !this.isHot } }, watch:{ numbers:{ deep:true, handler(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } } } }) </script> </body>
简写形式
只有一个配置的时候,使用简写形式
有两种简写形式
-
正常写法 watch:{ numbers:{ deep:true, handler(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } } } 简写 watch:{ isHot(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } }
-
//正常写法 // vm.$watch('isHot',{ // deep:true, // handler(newValue,oldValue){ // console.log('isHot被修改了',newValue,oldValue) // } // }) //简写 vm.$watch('isHot',function(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) })
计算属性与监视属性的区别
-
computed能完成的功能watch一定能完成。
-
watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
-
所被vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。
-
所有不被vue所管理的函数(定时器的回调函数、ajax的回调函数等、promise的回调函数),最好写成箭头函数,这样this的指向才是vm或者组件实例对象。