watch
和 watchEffect
都是 Vue 3 中的响应式 API,用来监听数据变化,但它们有一些关键的区别。
1. watch
watch
用于监听特定的响应式数据或计算属性的变化。当被监听的值发生变化时,watch
会执行回调函数。
-
适用场景:当你需要精确控制哪些数据变化时,或者需要执行一些副作用操作(比如异步请求、数据处理等)。
-
监听目标:需要明确指定监听的数据(可以是响应式引用、计算属性、或者 getter 函数)。
-
语法:
-
import { watch } from 'vue';
const count = ref(0);
watch(count, (newValue, oldValue) => {
console.log('count changed from', oldValue, 'to', newValue);
}); -
特点:
- 需要指定需要监听的对象(比如
count
)。 - 通过传递一个回调函数来处理变化,并可以访问变化前后的值。
- 可以通过
deep: true
来深度监听对象,或者通过immediate: true
来立即触发一次回调。
- 需要指定需要监听的对象(比如
2. watchEffect
watchEffect
是一个自动收集依赖的监听器,它会自动追踪其内部所有响应式数据的变化。当其中的任何响应式数据发生变化时,watchEffect
会重新执行。
-
适用场景:当你不想明确指定要监听哪些数据,而是希望自动根据响应式依赖关系来触发副作用(比如自动更新 DOM、执行计算等)。
-
监听目标:不需要显式指定要监听的响应式数据,
watchEffect
会自动追踪在其作用域内访问的所有响应式数据。 -
语法:
-
import { watchEffect } from 'vue';
const count = ref(0);
watchEffect(() => {
console.log('The count is:', count.value);
}); - 如果你只需要监听某些特定的数据或计算属性的变化,并对比前后的值,使用
watch
。 - 如果你希望自动根据作用域内的响应式数据变化执行副作用,且不关心具体依赖项,使用
watchEffect
。