watchEffect默认立即执行,无需配置immediate:它在组件setup完成、DOM未挂载时首次运行,自动追踪回调中读取的响应式数据,执行→追踪→再执行;而watch需显式设置immediate:true才首次执行,属可选行为。

watchEffect 默认就是立即执行的,不需要额外配置 immediate: true。它在组件 setup 执行完毕、DOM 尚未挂载完成时就运行第一次,天然适配“一上来就要响应”的场景。
为什么说它是“立即执行”的?
watchEffect 的设计逻辑决定了它会在创建后立刻触发回调函数,而不是等依赖变化才开始工作。这个首次执行发生在:
- 响应式依赖已就绪(比如 ref 已创建、route.params 可读)
- 组件实例已完成初始化,但 DOM 还没完全渲染(接近 onBeforeMount 阶段)
- 函数内部读取的所有响应式数据都会被自动追踪,为后续更新做准备
和 watch 的 immediate 有啥区别?
watch 需要显式加 immediate: true 才能首次执行,而 watchEffect 是默认行为。这不是“可选功能”,而是它的核心机制:
- watch 是“监听→变化→执行”,immediate 只是让它多一次初始触发
- watchEffect 是“执行→追踪→再执行”,首次执行本身就是流程起点
- 如果 watchEffect 回调里没读任何响应式数据,它就只执行一次,也不会再响应变化
立即执行带来的实际好处
省去手动判断是否首次加载的逻辑,让代码更贴近业务意图:
立即学习“前端免费学习笔记(深入)”;
- 页面标题随 count 变化:不用管是不是第一次渲染,改完就生效
- 根据路由参数拉用户数据:组件一打开,id 有值就发请求,无需 mounted 后再取
- 表单联动初始化:依赖字段一存在,关联逻辑就自动同步,不卡在“等待挂载”环节
注意边界情况
立即执行不等于“绝对安全”,有些场景仍需谨慎:
- 若回调中访问了尚未初始化的 ref(比如值为 undefined),可能报错或逻辑跳过
- 异步操作(如 fetch)的首次执行,要配合 onInvalidate 做清理,避免上一次请求残留
- 条件分支内读取响应式数据时,只有满足条件的路径才会被追踪(动态依赖收集)


















