在Vue3的Composition API中,`watch`函数提供了强大的响应式数据监听能力,深度监听(`deep`)是一个非常实用的功能,它允许我们对对象或数组的内部变化进行监听,下面将详细介绍如何使用`watch`进行深度监听。
基本的watch使用
在Vue3的Composition API中,watch
函数可以用来监听响应式数据的变化,监听一个简单的响应式变量:
import { ref, watch } from 'vue'; export default { setup() { const count = ref(0); watch(count, (newValue, oldValue) => { console.log(`count 变化了,新值: ${newValue},旧值: ${oldValue}`); }); return { count }; } };
在上述代码中,我们通过watch
监听了count
这个ref
类型的响应式数据,每当count
的值发生变化时,回调函数就会被触发。
监听对象属性变化(默认浅监听)
当我们尝试监听一个对象时,默认情况下watch
是浅监听的。
import { ref, watch } from 'vue'; export default { setup() { const user = ref({ name: '张三', age: 20 }); watch(user, (newValue, oldValue) => { console.log('user 对象变化了'); }); // 下面这行代码不会触发watch回调 user.value.age = 21; return { user }; } };
在上述代码中,直接修改user.value.age
并不会触发watch
的回调函数,因为默认是浅监听,它只检测user
引用的变化,而不是对象内部属性的变化。
使用deep进行深度监听对象
为了监听对象内部属性的变化,我们需要使用deep
选项,修改上面的代码如下:
import { ref, watch } from 'vue'; export default { setup() { const user = ref({ name: '张三', age: 20 }); watch(user, (newValue, oldValue) => { console.log('user 对象变化了'); }, { deep: true }); user.value.age = 21; // 此时会触发watch回调 return { user }; } };
通过设置{ deep: true }
,watch
会对user
对象进行深度监听,即使是对象内部属性的变化也能被监听到。
深度监听数组变化
watch
同样可以深度监听数组的变化。
import { ref, watch } from 'vue'; export default { setup() { const list = ref([1, 2, 3]); watch(list, (newValue, oldValue) => { console.log('list 数组变化了'); }, { deep: true }); list.value.push(4); // 会触发watch回调 return { list }; } };
当我们通过push
方法修改数组时,由于设置了deep: true
,watch
的回调函数会被触发。
监听对象特定属性的深度变化
有时候我们可能只想监听对象中某个特定属性的深度变化,只想监听user
对象中address
属性的变化:
import { ref, watch } from 'vue'; export default { setup() { const user = ref({ name: '张三', address: { city: '北京', street: '长安街' } }); watch(() => user.value.address, (newValue, oldValue) => { console.log('user.address 变化了'); }, { deep: true }); user.value.address.city = '上海'; // 会触发watch回调 return { user }; } };
在上述代码中,我们通过传入一个返回特定属性的函数作为第一个参数,并且设置deep: true
,实现了对user.address
的深度监听。
注意事项
- 性能问题:深度监听会递归遍历对象或数组的所有属性,这在数据量较大时可能会对性能产生一定影响,所以在使用时要谨慎,确保确实有必要进行深度监听。
- 新旧值比较:在深度监听时,由于对象或数组的变化可能是内部的,所以
oldValue
和newValue
可能看起来是相同的引用,在修改user.value.age
时,oldValue
和newValue
的user
引用并没有改变,只是内部属性变化了,如果需要精确比较新旧值的差异,可能需要更复杂的逻辑,比如使用lodash
的isEqual
方法。
通过以上介绍,相信你对Vue3中使用composition API
的watch
进行深度监听(deep
)有了更深入的理解,在实际项目中,可以根据具体需求灵活运用这些特性,实现更高效、更精准的响应式数据监听。
网友回答文明上网理性发言 已有0人参与
发表评论: