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 条评论