watch()
监视属性watch:
1 当被监视的属性变化时(也可以监视计算属性),回调函数自动调用,进行相关操作
2 监视的属性必须存在才能好进行监视
3 监视的两种写法:
(1)在Vue.createApp时传入watch配置
(2)通过vm.$watch监视
4 深度监视
(1)Vue中的watch默认不监视对象内部值的改变(一层)
(2)配置deep为true,可以检测对象内部值改变(多层)
监视多级结构中某个属性的变化:’number.a’
监视多级结构中所有属性第1变化,用deep:true
PS:(1)Vue自身可以检测对象内部值的改变但是Vue提供的watch默认不可以
(2)使用watch时根据数据的具体结构,决定是否采用深度监视
vm.$watch(expOrFn,callback,[options])
- expOrFn:{string/Function}
- callback:{Function/Object}
- options:{Object}
- deep:{boolean}
- immediate:{boolean}
返回值:unwatch函数
用处:观察Vue实例上的一个表达式或者一个函数计算结果的变化,回调函数得到的参数为新值和旧值。表达式只接受简单的键路径,对于复杂表达式,用函数取代
1 | //HTML |
在带有immediate选项时不能在第一次回调时取消侦听给定的property
1 | const unwatch=vm.$watch( |
要在回调函数里调用一个取消侦听的函数应该先检查其函数的可用性
1 | let unwatch=null; |
Vue3中的watch
两个“坑”:
watch监视的是reactive定义的响应式数据则无法正确获得oldValue,watch监视的是reactive定义的响应式数据则强制开启深度监视,只能获取newValue,无法获取oldValue
监视reactive定义的某个对象中的属性(也是对象),deep有效,仍然无法获取oldValue
关于.value:
- 如果ref定义的是一个数字或者字符,比如ref(0)不能用.value
- 如果ref定义的是一个对象,则里面的属性本质上是由reactive定义,如果要监视里面的属性则得用.value,.value后由reactive定义,则自动开启深度监视,或者开启深度监视
1 | setup(){ |