Vue 3中的watch
和watchEffect
都是用于监听响应式数据变化的重要工具,但它们在使用方式、执行时机和依赖追踪上有明显的区别,适用于不同的场景:
watch
接受一个源数据(可以是getter函数、ref、reactive对象的某个属性等)和一个回调函数。它可以配置为惰性执行(默认)、立即执行(通过immediate: true
)或深度监听(通过deep: true
)。watch
是惰性的,只有当被观察的数据源发生变化时,回调函数才会首次执行。如果设置了immediate: true
,则会在初始挂载时立即执行一次。watch
只追踪显式指定的数据源,不会自动追踪回调函数内部访问到的所有响应式属性。这意味着你可以更精确地控制何时触发回调以及因何触发。watch
更为合适。它也适合那些需要对数据变化前后值进行比较的场景。watchEffect
接受一个回调函数,它会自动追踪该回调内访问的所有响应式依赖,并在依赖项变化时重新执行回调。watchEffect
总是立即执行,并在每次依赖项变化时重新执行,没有惰性选项。watchEffect
非常方便。适用于简单的副作用处理,比如自动更新界面、发送网络请求等,特别是在依赖关系简单且明确的情况下。选择watch
还是watchEffect
主要取决于具体的使用需求:
watch
。watchEffect
可能更适合,因为它能自动管理依赖。