当前位置:首页 > VUE

vue如何实现数据监听

2026-02-21 08:15:24VUE

Vue 数据监听的实现方式

Vue 主要通过数据劫持和发布-订阅模式实现数据监听,核心是 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法:

使用 Object.defineProperty(Vue 2)

通过劫持对象的属性访问和修改,触发依赖收集和更新通知。

vue如何实现数据监听

// 简易实现
function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集依赖
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}
  • 依赖收集:在 getter 中通过 Dep 类收集当前属性的依赖(如 Watcher)。
  • 触发更新:在 setter 中通过 Dep.notify() 通知所有依赖执行更新。

使用 Proxy(Vue 3)

Proxy 可以监听整个对象,无需递归遍历属性,性能更好。

vue如何实现数据监听

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    }
  });
}
  • 优势:支持监听动态新增属性、数组索引修改等场景。

监听数组变化

Vue 2 通过重写数组方法(如 pushpop)实现监听:

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);

['push', 'pop', 'shift'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 触发更新
    return result;
  };
});

手动监听:$watch API

Vue 提供 $watch 方法手动监听数据变化:

export default {
  data() {
    return { count: 0 };
  },
  created() {
    this.$watch('count', (newVal, oldVal) => {
      console.log(`count变化:${oldVal} -> ${newVal}`);
    });
  }
};
  • 深度监听:通过 { deep: true } 监听嵌套对象。

注意事项

  1. 性能开销:频繁监听大型对象可能影响性能,建议拆分数据。
  2. 异步更新:Vue 的更新是异步的,多次修改会合并为一次渲染。
  3. 避免循环引用:监听循环引用对象可能导致栈溢出。

分享给朋友:

相关文章

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序的步骤 在 Vue 中实现冒泡排序,可以通过数据绑定和计算属性来动态展示排序过程。以下是一个完整的实现示例。 示例代码 <template> <div>…

vue如何实现登录

vue如何实现登录

Vue 实现登录功能的方法 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,通常命名为 Login.vue。表单包含用户名和密码输入框,以及提交按钮。 <template>…

vue如何实现计算

vue如何实现计算

Vue 计算属性的实现方法 在 Vue 中,计算属性(computed properties)是一种基于响应式依赖进行缓存的属性,适用于处理复杂逻辑或依赖其他数据属性的场景。以下是实现计算属性的几种方…

vue实现数据翻译

vue实现数据翻译

Vue 数据翻译实现方案 在 Vue 项目中实现数据翻译通常涉及国际化(i18n)或多语言支持,以下是几种常见方法: 使用 vue-i18n 插件 安装 vue-i18n 依赖: npm inst…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…