0
点赞
收藏
分享

微信扫一扫

Vue进阶(八十九):watch 用法详解

(文章目录)

Vue中,应用watch来响应数据的变化,示例代码如下,

一、第一种方式

<input type=text v-model=userName/>  
//监听当userName值发生变化时触发
watch: {
userName (newName, oldName) {
console.log(newName)
}
}

第一种方式有一个缺点: 就是当值第一次绑定的时候不会执行监听函数,只有当值改变的时候才会执行。

如果我们想在第一次绑定的时候就执行此监听函数,则需要设置immediatetrue。比如当父组件向子组件动态传值时,子组件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的区别》
举报

相关推荐

0 条评论