当前位置:首页 > VUE

vue数据监听具体实现

2026-02-23 17:01:11VUE

Vue 数据监听实现原理

Vue 的数据监听主要通过 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现,核心是依赖收集和派发更新。

Vue 2.x 基于 Object.defineProperty

  1. 初始化数据监听 遍历数据对象的属性,通过 Object.defineProperty 将属性转换为 getter/setter:

    vue数据监听具体实现

    function defineReactive(obj, key, val) {
      Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get() {
          console.log('收集依赖');
          return val;
        },
        set(newVal) {
          if (newVal === val) return;
          console.log('触发更新');
          val = newVal;
        }
      });
    }
  2. 依赖收集 在 getter 中,通过 Dep 类和 Watcher 类建立依赖关系:

    class Dep {
      constructor() {
        this.subs = [];
      }
      addSub(sub) {
        this.subs.push(sub);
      }
      notify() {
        this.subs.forEach(sub => sub.update());
      }
    }
  3. 数组监听 对数组方法(如 pushpop)进行重写,在调用原生方法后手动触发更新:

    vue数据监听具体实现

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

Vue 3.x 基于 Proxy

  1. Proxy 代理 使用 Proxy 直接监听整个对象,无需递归遍历属性:

    function reactive(obj) {
      return new Proxy(obj, {
        get(target, key) {
          track(target, key); // 依赖收集
          return Reflect.get(target, key);
        },
        set(target, key, value) {
          Reflect.set(target, key, value);
          trigger(target, key); // 触发更新
          return true;
        }
      });
    }
  2. 性能优化 Proxy 能直接监听新增/删除属性,且对嵌套对象延迟处理(惰性监听)。

差异对比

  • Vue 2.x:需递归遍历对象、需特殊处理数组,无法检测新增属性(需 Vue.set)。
  • Vue 3.x:支持动态属性、性能更高,但需注意浏览器兼容性(IE 不支持 Proxy)。

实际应用建议

  1. 对于复杂对象,优先使用 Vue 3.x 的 reactiveref
  2. 在 Vue 2.x 中修改数组时,使用 Vue.set 或数组的变异方法(如 splice)。

标签: 具体数据
分享给朋友:

相关文章

vue实现数据删除

vue实现数据删除

Vue 实现数据删除的方法 在 Vue 中删除数据通常涉及操作数组或对象,并结合响应式更新。以下是几种常见实现方式: 从数组中删除数据 使用 splice 方法删除数组中的指定项: methods…

vue怎么实现数据

vue怎么实现数据

Vue 数据实现方式 Vue 提供了多种方式来实现数据的响应式绑定和管理,核心是通过数据驱动视图的更新。 响应式数据声明 在 Vue 组件中,可以通过 data 选项声明响应式数据。这些数据会被 V…

vue实现数据筛选

vue实现数据筛选

数据筛选的实现方式 在Vue中实现数据筛选可以通过计算属性、方法或第三方库完成。以下是几种常见的方法: 计算属性筛选 使用计算属性对数组数据进行筛选,具有缓存特性,适合静态或较少变化的数据。 co…

vue实现数据多级显示

vue实现数据多级显示

Vue 实现多级数据展示 在 Vue 中实现多级数据展示通常涉及递归组件或嵌套循环。以下是几种常见方法: 递归组件实现 递归组件适合处理不确定层级深度的树形结构数据: <templa…

vue实现动态刷新数据

vue实现动态刷新数据

Vue 实现动态刷新数据的方法 使用计算属性(Computed Properties) 计算属性会根据依赖的响应式数据自动更新,适合基于现有数据动态计算的场景。 <template>…

vue实现评论数据展示

vue实现评论数据展示

Vue 实现评论数据展示 数据准备与结构设计 评论数据通常以数组形式存储,每个评论对象包含用户信息、内容、时间等字段。示例数据结构如下: comments: [ { id: 1,…