当前位置:首页 > 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 实现数据拖动 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事件…

vue实现数据累加

vue实现数据累加

实现数据累加的基本方法 在Vue中实现数据累加可以通过多种方式完成,常见的有直接操作数据、使用计算属性或结合方法调用。以下是几种典型实现方式: 直接操作数据 在模板或方法中直接对响应式数据进行累加…

vue实现数据搜索

vue实现数据搜索

实现数据搜索的基本思路 在Vue中实现数据搜索功能通常涉及以下几个核心步骤:监听用户输入、过滤数据列表、动态更新视图。以下是具体实现方法: 监听搜索输入 使用v-model双向绑定搜索框输入值,配…

vue实现数据太多

vue实现数据太多

处理 Vue 中大数据量的优化方案 虚拟滚动(Virtual Scrolling) 使用 vue-virtual-scroller 或 vxe-table 等库实现虚拟滚动,仅渲染可视区域内的 DOM…

vue如何实现数据

vue如何实现数据

Vue 数据实现方式 Vue 提供了多种方式实现数据管理和响应式更新,核心机制基于响应式系统和状态管理方案。 响应式数据声明 在组件选项中使用 data 函数返回对象,Vue 会自动递归转换属性为…

vue实现提交数据

vue实现提交数据

使用表单提交数据 在Vue中可以通过v-model绑定表单数据,结合@submit事件处理提交逻辑。以下是一个基础表单提交示例: <template> <form @submi…