watchEffect
和watch
是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
时,你需要明确指出要侦听的状态,它提供了更精细的控制,包括对比旧值和新值的能力,适合于需要精确控制的情况。