
Vue3中watchEffect的触发条件探究
watchEffect是Vue3中一个强大的副作用函数,它会在其依赖的响应式数据发生变化时自动重新执行。通常情况下,依赖收集是通过访问响应式属性(触发get操作)来实现的。然而,以下代码示例引发了一个疑问:
setup() {
const obj = reactive({});
watchEffect(() => {
console.log(obj);
});
obj.num = 3; // 触发 watchEffect 回调执行
}
代码中,仅仅打印obj(并没有直接访问obj.num,理论上不会触发get),却也能收集到依赖,导致watchEffect回调函数被执行。
深入理解watchEffect的依赖收集机制
立即学习“前端免费学习笔记(深入)”;
watchEffect的依赖收集机制并非仅仅依赖于get操作。它同时监听了响应式对象底层Proxy对象的set操作。当obj.num = 3执行时,Proxy对象的set拦截器被触发,watchEffect检测到这个变化,从而触发回调函数。
虽然大多数情况下,仅通过get操作收集依赖就足够了,但监听set操作在某些特殊场景下具有优势:
-
自定义
Proxy: 当使用自定义Proxy实现响应式系统时,set监听机制能确保在不触发get的情况下也能正确收集依赖。 -
非
re-render更新: 在某些情况下,需要更新响应式属性但不希望触发组件重新渲染,set监听机制能满足这种需求。
因此,watchEffect的依赖收集机制比我们想象的更全面,它兼顾了get和set操作,提供了更灵活和强大的响应式能力。











