一 watch和watchEffect的区别

Vue 3中的watchwatchEffect都是用于监听响应式数据变化的重要工具,但它们在使用方式、执行时机和依赖追踪上有明显的区别,适用于不同的场景:

1.1 watch

  • 使用方式watch接受一个源数据(可以是getter函数、ref、reactive对象的某个属性等)和一个回调函数。它可以配置为惰性执行(默认)、立即执行(通过immediate: true)或深度监听(通过deep: true)。
  • 执行时机:默认情况下,watch是惰性的,只有当被观察的数据源发生变化时,回调函数才会首次执行。如果设置了immediate: true,则会在初始挂载时立即执行一次。
  • 依赖追踪watch只追踪显式指定的数据源,不会自动追踪回调函数内部访问到的所有响应式属性。这意味着你可以更精确地控制何时触发回调以及因何触发。
  • 适用场景:当需要在数据变化时执行复杂的逻辑,或者需要基于多个数据源的变化作出响应时,使用watch更为合适。它也适合那些需要对数据变化前后值进行比较的场景。

1.2 watchEffect

  • 使用方式watchEffect接受一个回调函数,它会自动追踪该回调内访问的所有响应式依赖,并在依赖项变化时重新执行回调。
  • 执行时机watchEffect总是立即执行,并在每次依赖项变化时重新执行,没有惰性选项。
  • 依赖追踪:自动追踪并重新执行,无需显式指定依赖项。这使得代码更简洁,但也可能导致副作用更加隐晦,因为任何响应式依赖变化都会触发执行。
  • 适用场景:当需要一个副作用自动响应任何依赖变化时,watchEffect非常方便。适用于简单的副作用处理,比如自动更新界面、发送网络请求等,特别是在依赖关系简单且明确的情况下。

1.3 总结

选择watch还是watchEffect主要取决于具体的使用需求:

  • 如果你需要更细粒度的控制,或者需要在回调中比较新旧值,应该使用watch
  • 如果你追求代码简洁,且副作用逻辑直接依赖于响应式数据,那么watchEffect可能更适合,因为它能自动管理依赖。