在 Vue 3 中,watch
和 watchEffect
都是用于观察和响应 Vue 实例上的数据变化的功能,但它们在使用方式、响应性追踪和行为上有一些关键区别。
-
使用方式:
watch
需要显式地指定要观察的数据源(可以是一个 getter 函数、一个 ref、一个 reactive 对象或它们的计算属性),以及当数据源变化时要执行的回调函数。watchEffect
则自动追踪响应式依赖,并在任何依赖项变化时执行一个函数。你不需要显式地告诉它要观察什么;它会自动收集依赖。
-
响应性追踪:
- 在
watch
中,你通过提供一个 getter 函数来指定依赖项。Vue 会追踪这个函数内部访问的所有响应式属性,并在它们变化时触发回调。这种追踪是精确的,只包括你明确指定的属性。 watchEffect
的追踪是自动的。它运行一个函数,并“记住”这个函数访问了哪些响应式属性。当这些属性中的任何一个变化时,watchEffect
都会重新运行该函数。这种方式的追踪可能更加宽泛,因为它包括了函数执行过程中访问的所有响应式数据。
- 在
-
执行时机:
watch
在初始化时不会立即执行回调,除非明确设置了immediate: true
选项。它只在依赖的数据变化时执行。watchEffect
在初始化时会立即执行一次,以收集依赖,并在任何依赖项变化时再次执行。
-
清理:
- 当你不再需要观察者时,可以使用
watch
返回的停止函数来手动停止观察。这对于避免内存泄漏和不必要的计算很有用。 watchEffect
同样返回一个停止函数,允许你在需要时停止观察。
- 当你不再需要观察者时,可以使用
-
用途:
watch
更适合用于特定的、已知的数据源的观察,特别是当你需要精确控制何时以及如何响应数据变化时。watchEffect
更适合用于快速原型设计或当你不想显式指定所有依赖项时。它的自动追踪特性可以简化代码,但也可能导致意外的重新执行,特别是当函数内部有复杂的逻辑或副作用时。
总的来说,watch
和 watchEffect
在 Vue 3 中提供了灵活且强大的数据观察机制。选择哪一个取决于你的具体需求和偏好。