watchEffect 的“立即执行”指在 setup 阶段结束、DOM 未挂载时自动触发首次调用,早于 onBeforeMount;它无 immediate 选项,执行即追踪依赖,依赖变化后自动重新执行。

watchEffect 的“立即执行”,不是指等组件挂载完成(onMounted)之后才运行,而是指它在组件 setup 阶段结束、DOM 尚未挂载时就自动触发第一次调用。这个行为是内置的、强制的,不需要任何配置。
执行时机:比 onBeforeMount 还早一点
它发生在:
- 响应式数据(如
ref、reactive、route.params)已创建并可读取 - 组件实例已完成初始化,但真实 DOM 节点还没插入文档(
el为空或未挂载) - 接近
onBeforeMount生命周期,但严格来说更早——属于 Vue 内部“副作用注册与首次求值”阶段
为什么叫“无条件”?
和 watch 不同:
-
watch默认不执行,必须加immediate: true才有初始触发 -
watchEffect没有immediate选项,它的首次执行是机制起点,不是附加功能 - 哪怕回调里只写
console.log('hi'),只要 setup 执行到这行,立刻打印
它怎么知道该监听谁?
靠“执行即追踪”:
- 第一次运行时,Vue 会拦截所有对响应式数据的
.value或属性访问(getter) - 把用到的 ref、reactive 属性、路由状态等自动记为依赖
- 后续这些依赖变化 → 触发 setter → 推入更新队列 → 异步重新执行整个回调
一个典型例子
假设你写:
const count = ref(0)watchEffect(() => {
console.log('count is', count.value)
})
结果是:
- 组件一进入 setup,立刻输出
count is 0 - 之后每次
count.value++,再输出新值 - 如果回调里没读任何响应式数据(比如只调用
Math.random()),那它就只执行一次,也不再响应变化


















