直接监听响应式对象
直接给 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,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能。
