Vue 3 Composition API watchEffect 和 watch的区别

11 min read

watchEffectwatch是Vue 3 Composition API中两个强大的响应式特性,它们都用于侦听响应式状态的变化并执行副作用,但它们在使用方式和场景上有明显的差异。

watchEffect

  • 自动侦测依赖watchEffect会自动追踪其函数内部所访问的任何响应式状态,并在这些状态变化时重新执行。
  • 立即执行watchEffect在创建时会立即执行一次,以便立即同步状态。
  • 使用场景:当你想要在多个数据源变化时执行同一个副作用,而不需要明确指定依赖时,使用watchEffect非常合适。它简化了侦听多个来源的状态变化的逻辑。

watch

  • 需指定侦听源watch需要明确指定一个或多个响应式引用或getter函数作为侦听源,仅当指定的侦听源发生变化时,回调函数才会被调用。
  • 延迟执行watch只有在侦听的源发生变化后才会执行,不会在初始化时立即执行。
  • 更细粒度的控制watch允许访问旧值和新值,提供了更细粒度的控制,使得在旧值和新值之间需要比较或执行更复杂逻辑时更为方便。
  • 使用场景:当你需要侦听一个或几个特定的数据源,并且可能需要访问变化前后的值时,watch是更好的选择。它适用于需要对侦听的数据进行更精确控制的场景。

示例对比

watchEffect 示例

watchEffect(() => {
  console.log(props.currentDate); // 自动追踪并在currentDate变化时执行
});

watch 示例

watch(() => props.currentDate, (newValue, oldValue) => {
  console.log(newValue, oldValue); // 只有currentDate变化时才执行,可访问旧值和新值
});

总结:

  • 使用watchEffect时,你不需要指定侦听哪些状态,Vue 会自动追踪并在任何被追踪的响应式状态变化时执行副作用。
  • 使用watch时,你需要明确指出要侦听的状态,它提供了更精细的控制,包括对比旧值和新值的能力,适合于需要精确控制的情况。