vue3中watch和watcheffect有何不同

288 阅读2分钟

vue3中watch和watcheffect有何不同

在 Vue 3 中,watch 和 watchEffect 都是用于监听响应式数据变化的 API,但它们的用途和行为有一些关键区别。以下是它们的详细对比:

  1. 功能概述
  • watch

    • 用于监听特定的响应式数据源,并在数据变化时执行回调函数。

    • 可以监听单个或多个数据源。

    • 提供旧值和新值。

  • watchEffect

    • 自动追踪其回调函数中使用的响应式数据,并在这些数据变化时重新执行回调。

    • 不需要显式指定监听的数据源。

    • 不提供旧值,只关注当前值。

  1. 使用方式

2.1 watch

import { ref, watch } from "vue";

const count = ref(0);

watch(count, (newValue, oldValue) => {
  console.log(`count 从 ${oldValue} 变为 ${newValue}`);
});

// 修改 count
count.value++;

特点:

  • 需要显式指定监听的数据源(如 count)。

  • 回调函数接收两个参数:newValueoldValue

2.2 watchEffect

import { ref, watchEffect } from "vue";

const count = ref(0);

watchEffect(() => {
  console.log(`count 的值是 ${count.value}`);
});

// 修改 count
count.value++;

特点:

  • 不需要显式指定监听的数据源,自动追踪回调函数中使用的响应式数据。

  • 回调函数没有参数,无法直接获取旧值。

  1. 使用场景

3.1 watch 的适用场景

  • 需要监听特定数据的变化,默认不立即执行。

  • 需要获取变化前后的值(newValueoldValue)。

  • 需要控制监听的行为(如 immediatedeep 等选项)。

3.2 watchEffect 的适用场景

  • 需要自动追踪多个响应式数据的变化。

  • 不需要旧值,只关注当前值。

  • 需要立即执行副作用。

  1. 高级用法

4.1 watchdeep 选项

如果需要监听对象或数组的内部变化,可以使用 deep: true

const state = reactive({ user: { name: "Alice" } });

watch(
  () => state.user,
  (newValue, oldValue) => {
    console.log("user 发生变化");
  },
  { deep: true } // 深度监听
);

4.2 watchEffect 的清理副作用

watchEffect 的回调函数可以返回一个清理函数,用于在重新运行副作用之前执行清理操作。

watchEffect((onCleanup) => {
  const timer = setTimeout(() => {
    console.log("执行副作用");
  }, 1000);

  onCleanup(() => {
    clearTimeout(timer); // 清理副作用
  });
});
  1. 总结
  • watch

    • 适合监听特定数据源,提供旧值和新值。

    • 支持 immediatedeep 等选项。

    • 适用于需要精确控制监听行为的场景。

  • watchEffect

    • 自动追踪依赖,无需显式指定数据源。

    • 默认立即执行,适合执行副作用。

    • 适用于需要自动追踪多个响应式数据的场景。

根据具体需求选择合适的 API:

  • 如果需要监听特定数据并获取旧值,使用 watch

  • 如果需要自动追踪依赖并执行副作用,使用 watchEffect

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github