面试题之Watch和WatchEffect的区别

215 阅读2分钟

在Vue 3中,为了更好地处理响应式数据的变化,提供了两种监听机制:watchwatchEffect。这两种方法虽然都用于监听数据变化并执行相应的逻辑,但它们之间存在显著差异,本文将讲述它们的区别及用法。

Watch:手动指定依赖项

watch 更适用于当你需要明确地监听一个或多个特定的响应式数据源时。你可以通过它来监听 refreactive 对象,并且可以针对这些对象的变化执行复杂的逻辑,比如发起网络请求、检查库存等。值得注意的是,使用 watch 需要你手动指定想要监听的数据源。此外,如果你希望在监听器创建时立即执行一次回调函数,可以通过设置 immediate: true 来实现。

屏幕截图 2025-03-19 212328.png

此处在 Vue 3 中使用 <script setup> 语法和 watch 函数来监听一个响应式数据的变化。通过这种方式,我们可以执行副作用或者在数据变化时进行某些操作。例子中,当 count 发生变化时,会打印出旧值和新值,并且通过设置 immediate: true 来确保回调函数在初始化时也会被立即调用一次。

WatchEffect:自动收集依赖项

相比watch之下,watchEffect 则更加智能和便捷。它不需要你手动指定依赖项,而是会自动收集在函数内部使用的响应式数据作为依赖。这意味着,只要这些依赖发生变化,watchEffect 就会被触发。同时,watchEffect 在创建时会立即执行一次,不需要通过设置 immediate: true,以确保所有依赖都被正确地收集。这种特性使得 watchEffect 特别适合于处理那些依赖关系比较复杂或者动态的情况。

屏幕截图 2025-03-19 212341.png

在Vue 3 的 Composition API 的单文件组件示例。这个组件展示了如何使用 ref 来定义响应式数据、computed 属性来计算衍生数据(在这个例子中直接使用了 watchEffect),以及 watchEffect 函数来自动追踪依赖并更新其他值。

实际应用中的选择

  • 使用 watch 的场景:当你有明确的数据源需要监听,并且可能需要在监听的同时执行一些异步操作或复杂的业务逻辑时,watch 是更好的选择。
  • 使用 watchEffect 的场景:当你希望快速监听一系列数据的变化,并且不介意让 Vue 自动管理依赖关系时,watchEffect 可以为你节省大量的时间和精力。

总之,理解watch 和 watchEffect 都是非常重要的,希望以上的内容对你的职业路上有所帮助。