本文主要是介绍Vue进阶(八十九):watch 用法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、第一种方式
- 二、第二种方式
- 三、第三种方式
- 四、监听数组变化
- 五、注意事项⚠️
- 六、拓展阅读
在Vue
中,应用watch
来响应数据的变化,示例代码如下,
一、第一种方式
<input type="text" v-model="userName"/>
//监听当userName值发生变化时触发
watch: {userName (newName, oldName) {console.log(newName)}
}
第一种方式有一个缺点: 就是当值第一次绑定的时候不会执行监听函数,只有当值改变的时候才会执行。
如果我们想在第一次绑定的时候就执行此监听函数,则需要设置immediate
为true
。比如当父组件向子组件动态传值时,子组件props
首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate
设为true
。
二、第二种方式
watch: {userName: {handler (newName, oldName) {console.log(newName)},immediate: true}
}
immediate
表示在watch
中首次绑定的时候,是否执行handler
,值为true
则表示在watch
中声明时,立即执行handler
方法,值为false
,则和一般使用watch
一样,在数据发生变化的时候才执行handler
。
当需要监听一个对象的改变时,普通的watch
方法无法监听到对象内部属性的改变,只有data
中的数据才能够监听到变化,此时就需要deep
属性对对象进行深度监听。
三、第三种方式
<input type="text" v-model="cityName.name" />
data (){return {cityName: {name:'北京',location: '中国'}}
},
watch: {cityName: {handler(newName, oldName) {console.log(newName)},immediate: true,deep: true}
}
注:监测对象的时候,newVal == oldVal
此时会给cityName的所有属性都加上监听函数,如果属性较多时,每个属性值的变化都会执行handler
。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
watch: {'cityName.name': {handler(newName, oldName) {console.log(newName)},immediate: true,deep: true}
}
四、监听数组变化
1.watch
能监听到数组push
时的改变,例如
data () {return {demo: [1,2]}
},mounted (){window.myVue = this},
watch: {demo(val){console.log(val)}
},myVue.demo.push(3) //[1,2,3]
2.watch
不能检测以下变动的数组:
- 当你利用索引直接设置一个项时,例如:
myVue.demo[1] = 5
- 当你修改数组的长度时,例如:
myVue.demo.length = 2
此时,你可以删除原有键,再 $set
一个新的值,这样就可以触发watch
。
myVue.$set(myVue.demo,0,8) // [8,2,3]
3.更复杂一点,对数组嵌套对象进行监听的时候,这时就需要深度监听。
data () {return {demo:[{name:'张三',age:18},{name:'李四',age:20}]}
},
mounted (){window.myVue = this
},
watch: {demo: {handler (val) {console.log(val)},// 这里是关键,代表递归监听 demo 的变化deep: true}
},myVue.demo[0].age = 30 //[{name:'张三',age:30},{name:'李四',age:20}]
五、注意事项⚠️
- 在
watch
中不要使用箭头函数,因为箭头函数中的this
是指向当前作用域.
六、拓展阅读
- 《Vue进阶(八十四):Computed 和 Watch 使用与区别》
- 《Vue进阶(八十三): updated和watch的区别》
这篇关于Vue进阶(八十九):watch 用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!