watchEffect 能自动收集依赖,无需手动指定监听项,执行回调时自动追踪所有读取的响应式数据,后续任一变化即重新执行;支持清理函数和多种执行时机,但不提供新旧值对比且默认立即执行。
watchEffect 能自动收集依赖,不用手动写 watch 里那些字符串或函数形式的依赖项,代码更简洁、更少出错。
传统 watch 需要明确指定监听谁,比如 watch(() => count.value, ...) 或 watch('count', ...),稍不注意就漏掉深层属性或计算逻辑。而 watchEffect 会执行一次回调,在执行过程中“路过”的所有响应式数据(ref、reactive、computed)都会被自动记录为依赖。
user.name、list.length、isReady,它们就自动成为监听目标当一段副作用(比如发请求、更新 DOM、同步本地存储)依赖多个分散的响应式状态,且这些依赖可能随条件变化时,watchEffect 更自然。
watchEffect 里拼 api.search({ q, type, page }) 就行type 是 null),它没被读取,就不会加入依赖 —— 自动按需响应watchEffect 默认在组件更新前执行(flush: 'pre'),适合需要同步更新 DOM 的逻辑;也可设为 'post' 或 'sync'。它还提供清理函数,用于中断异步操作:
onInvalidate 参数,调用它可注册清理逻辑(如取消上一次请求)如果只关心某个值的变化前后值(oldValue / newValue),或者需要惰性执行(不立即触发)、或监听深层对象的某个固定路径(如 form.profile.address.city),传统 watch 仍更合适。
watchEffect 不提供旧值,只有当前值;需要对比时得自己缓存onInactivated 或标志位处理