vue2_中watch监听

vue watch监听的使用

1.概念

  • 没有缓存,数据变化,触发相应操作
  • 支持异步操作
  • 接收两个参数,第一个是最新的值,第二个是旧的值
  • 监听的数据是data中声明过父组件传递过来的prop中的值,还可以监听路由$route
  • immediate:组件加载立即触发回调函数的执行(为false时,只有监听的数据变化回调函数才会执行)
  • deep:深度监听,一般用来监听对象。

2.使用

普通使用:
//html部分
<template>
  <div>
    <p v-model="msg"></p>
  </div>
</template>

//js部分
props:['children']
data() {
    return {
      msg:'',
    };
  },
watch:{
	//监听data中数据
	msg(newV,oldV){
		console.log(newV,oldV)
	},
	//监听props中的
	children(newV,oldV){
		console.log(newV,oldV)
	},
	//监听vuex中的数据
	"$store.state.userInfo": function(newValue, oldValue) {
      ...
    }
    //监听路由
    "$route":"routeChange"   //routeChange方法,路由变化执行改方法
}
深度监听(deep)

deep:true 会把obj下面的属性层层遍历,性能开销较大。也可以直接 浅监听obj.msg

//html部分
<template>
  <div>
    <p v-model="obj.msg"></p>
  </div>
</template>
//js部分
data() {
    return {
      obj:{
       msg:'',
      }
    };
 },
watch:{
	obj:{
		handler(newV,oldV){
			console.log(newV,oldV)
		},
		deep:true,
		immediate:true
	}
}

3.注意事项

watch在某些情况下无法监听数组的变化

  • 通过下标修改数组数据
  • 通过arr.length改变数组长度

其他方案:

1. 通过 Vue 实例方法 set 进行设置 $set( target, propertyName/index, value);
   this.$set(this.arr,0,99);//将arr数组的第0项设置为99
   this.$set(this.obj,'msg','hello');//将obj对象的msg属性设置为'hello'


2.通过 $delete( target, propertyName/index )
  this.$delete(this.arr,0)//删除数组第0项
  this.$delete(this.obj,'msg') //删除对象的msg属性

你可能感兴趣的:(Vue,vue.js,javascript,前端)