watch:
watch 需要明确指定要侦听的响应式数据源,它可以侦听一个或多个数据源,如响应式对象的属性、getter 函数、甚至是多个数据源组成的数组。 watch 只会在侦听的数据源发生变更时才执行回调函数。 watch 可以访问旧值和新值,这使得你可以在回调函数中执行比较或复杂的逻辑。 watch 支持延迟执行回调函数,通过设置 flush: 'post' 或 flush: 'pre' 来控制是在组件更新之前还是之后执行。
watchEffect:
watchEffect 不需要明确指定要侦听的数据源,它会在函数内部自动追踪所有被访问的响应式数据。 watchEffect 在组件初始化时会立即执行一次,以收集依赖,之后会在任何依赖的数据变更时重新执行。 watchEffect 无法直接访问旧值和新值,因为它是为了处理副作用而设计的,通常用于执行一些异步操作或直接更新 DOM。 watchEffect 默认会在组件更新之前执行,但你可以通过设置 flush: 'post' 来改变这一行为。
区别与优缺点:
watch 更适合于特定的侦听场景,当你知道要侦听哪些特定的数据源时使用 watch 更为合适。它提供了更多的灵活性,并且可以访问旧值和新值。 watchEffect 更适合于一些通用的副作用场景,当你需要在函数中自动追踪多个数据源时使用 watchEffect 更为方便。它的自动依赖追踪减少了手动
指定依赖的需要,但这也意味着它可能执行更多的次数,因为它会在任何依赖的数据变更时重新执行。 在实际应用中,选择 watch 还是 watchEffect 取决于你的具体需求。如果你需要更细粒度的控制,或者需要访问旧值和新值,那么使用 watch 更合适。如果你需要自动追踪依赖,并且不关心旧值和新值,那么使用 watchEffect 可能更方便。
JStar