直接监听响应式对象
直接给 watch() 传入一个响应式对象,会隐式地创建一个深层侦听器——该回调函数在所有嵌套的变更时都会被触发:
但需要注意的是此时的newVal和oldVal是相等的,因为它们是同一个对象。
vue3文档的例子
const obj = reactive({ count: 0 })
watch(obj, (newValue, oldValue) => {
// 在嵌套的 property 变更时触发
// 注意:`newValue` 此处和 `oldValue` 是相等的
// 因为它们是同一个对象!
})
obj.count++
自己项目中的例子
const params = reactive({
area: -1,
type: -1,
initial: -1
})
watch(params, (newVal, oldVal) => {
console.log(newVal, oldVal);
trrigerGetArtistList()
}, { immediate: true })
由于设置了立即触发,第一次,newVal有值,oldVal为undefined
改变params中的属性:
监听返回响应式对象的getter
只有在 getter 函数返回不同的对象时,才会触发回调:
// 只有立即调用时触发,后面params改变也不触发
watch(() => params, (newVal, oldVal) => {
console.log(newVal, oldVal);
trrigerGetArtistList()
}, { immediate: true })
// 加上deep开启深度监听就可以正常触发
watch(() => params, (newVal, oldVal) => {
console.log(newVal, oldVal);
trrigerGetArtistList()
}, { immediate: true, deep: true })
深度监听性能问题
深度侦听需要遍历被侦听对象中的所有嵌套的 property,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能。