watch属性 watch初始化默认不执行,那么我们现在想要第一次初始化页面的时候也希望它能够执行 ‘某个属性’ 进行监听, 最后能把结果返回给 ‘basicMsg’ 值来。因此我们需要修改下我们的 watch的方法,需要引入handler方法和immediate属性,
<div id="app"> <p>空智个人信息情况: {{ basicMsg }}</p> <p>空智今年的年龄: <input type="text" v-model="age" /></p> </div> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { basicMsg: '', age: 31, single: '单身' }, watch: { age: { handler(newVal, oldVal) { this.basicMsg = '今年' + newVal + '岁' + ' ' + this.single; }, immediate: true } } }); </script>设置了 immediate:true的话,第一次页面加载的时候也会执行该handler函数的。即第一次 basicMsg 有值;
watch深层监听:
<script type="text/javascript"> var vm = new Vue({ el: '#app', data: { obj: { basicMsg: '', age: 31, single: '单身' } }, watch: { 'obj': { handler(newVal, oldVal) { this.basicMsg = '今年' + newVal.age + '岁' + ' ' + this.obj.single; }, immediate: true, deep: true // 需要添加deep为true 即可对obj进行深度监听 } } }); </script>设置deep:true;vue就会为对象每层都添加监听器;这样做显然会消耗性能;我们可以直接监听obj.age;
1.受JS的限制, Vue不能检测到对象属性的添加或删除的。它只能监听到obj这个对象的变化,比如说对obj赋值操作 会被监听到。 mounted(){ this.obj = { basicMsg: '2', age: 3, single: '单' } }watch 和 computed的区别是:
相同点:他们两者都是观察页面数据变化的。
不同点:computed只有当依赖的数据变化时才会计算, 当数据没有变化时, 它会读取缓存数据。 watch每次都需要执行函数。watch更适用于数据变化时的异步操作。