当前位置:首页 > VUE

vue实现watch

2026-02-10 14:14:36VUE

在 Vue 中实现 watch 监听数据变化

Vue 的 watch 功能用于监听数据变化并执行相应的回调函数。可以通过选项式 API 或组合式 API 实现。

选项式 API 中的 watch

在选项式 API 中,watch 是一个对象,键是需要监听的属性名,值是对应的回调函数或配置对象。

vue实现watch

export default {
  data() {
    return {
      count: 0,
      user: {
        name: 'Alice',
        age: 25
      }
    }
  },
  watch: {
    // 监听基本数据类型
    count(newVal, oldVal) {
      console.log(`count 从 ${oldVal} 变为 ${newVal}`);
    },
    // 监听对象属性
    'user.name'(newVal, oldVal) {
      console.log(`user.name 从 ${oldVal} 变为 ${newVal}`);
    },
    // 使用配置对象
    user: {
      handler(newVal, oldVal) {
        console.log('user 对象变化', newVal, oldVal);
      },
      deep: true, // 深度监听
      immediate: true // 立即执行
    }
  }
}

组合式 API 中的 watch

在组合式 API 中,watch 是一个函数,可以监听单个或多个数据源。

vue实现watch

import { ref, watch, reactive } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const user = reactive({
      name: 'Alice',
      age: 25
    });

    // 监听 ref
    watch(count, (newVal, oldVal) => {
      console.log(`count 从 ${oldVal} 变为 ${newVal}`);
    });

    // 监听 reactive 对象的属性
    watch(
      () => user.name,
      (newVal, oldVal) => {
        console.log(`user.name 从 ${oldVal} 变为 ${newVal}`);
      }
    );

    // 监听多个数据源
    watch(
      [() => user.name, count],
      ([newName, newCount], [oldName, oldCount]) => {
        console.log('多个数据变化', newName, newCount);
      }
    );

    // 深度监听和立即执行
    watch(
      () => user,
      (newVal, oldVal) => {
        console.log('user 对象变化', newVal, oldVal);
      },
      { deep: true, immediate: true }
    );

    return { count, user };
  }
}

watchEffect 的使用

watchEffect 是组合式 API 中的另一种监听方式,它会立即执行一次,并自动追踪其依赖。

import { ref, watchEffect } from 'vue';

export default {
  setup() {
    const count = ref(0);

    watchEffect(() => {
      console.log('count 的值是:', count.value);
    });

    return { count };
  }
}

停止监听

在组合式 API 中,watchwatchEffect 会返回一个停止监听的函数。

const stop = watch(count, (newVal) => {
  console.log('count 变化:', newVal);
});

// 停止监听
stop();

性能注意事项

  • 避免过度使用 deep,深度监听会增加性能开销。
  • 对于大型对象或数组,考虑监听特定属性而非整个对象。
  • 在组件卸载时,手动停止不需要的监听以避免内存泄漏。

通过以上方法,可以在 Vue 中灵活地监听数据变化并执行相应逻辑。

标签: vuewatch
分享给朋友:

相关文章

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript 图表…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动渲…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现 toast

vue实现 toast

Vue 实现 Toast 组件 在 Vue 中实现 Toast 组件可以通过多种方式完成,以下是几种常见的方法: 使用全局组件和事件总线 创建一个全局的 Toast 组件,并通过事件总线或 Vue…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…

vue实现hovuer

vue实现hovuer

Vue 实现 Hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 直接控制 通过 :hover 伪类实现,无需额外的 JavaScrip…