watch 用于监视一个或多个特定的响应式数据源,并在数据变化时执行回调。它类似于 Vue 2 中的 watch 选项,但在 Vue 3 中可以直接在组合式 API 中使用。
import { ref, watch } from 'vue';
const count = ref(0);
watch(count, (newVal, oldVal) => {
console.log(`Count changed from ${oldVal} to ${newVal}`);
});
count.value++; // 输出: Count changed from 0 to 1
watchEffect 用于立即运行一个函数并在其依赖的响应式数据发生变化时重新运行。它更类似于计算属性,但用于处理具有副作用的逻辑。
import { ref, watchEffect } from 'vue';
const count = ref(0);
watchEffect(() => {
console.log(`Count is: ${count.value}`);
});
count.value++; // 输出: Count is: 1
watchEffect 会自动跟踪响应式数据的依赖。选择 watch 还是 watchEffect,取决于具体的使用场景和需求。
watch 的场景watchEffect 的场景watchimport { ref, watch } from 'vue';
const count = ref(0);
const doubled = ref(0);
watch(count, (newVal, oldVal) => {
doubled.value = newVal * 2;
console.log(`Count changed from ${oldVal} to ${newVal}, doubled is now ${doubled.value}`);
});
watchEffectimport { ref, watchEffect } from 'vue';
const count = ref(0);
const doubled = ref(0);
watchEffect(() => {
doubled.value = count.value * 2;
console.log(`Count is: ${count.value}, doubled is now ${doubled.value}`);
});
在这个简单的示例中,watchEffect 更简洁,但在更复杂的场景下,watch 可能更适合。
watch:适合需要精确控制依赖、访问旧值和新值的场景。watchEffect:适合简单的副作用逻辑,自动依赖收集和立即执行的场景。通过理解和选择合适的工具,可以更有效地管理和响应数据变化。