当前位置:首页 > VUE

vue实现数据监听原理

2026-02-25 03:50:00VUE

Vue 数据监听原理

Vue 的数据监听主要通过 Object.definePropertyProxy 实现,核心是依赖收集和派发更新。以下是具体实现原理:

数据劫持

Vue 2.x 使用 Object.defineProperty 劫持对象的属性访问和修改。通过递归遍历数据对象的属性,将其转换为 getter/setter,从而在属性被访问或修改时触发依赖收集和更新。

vue实现数据监听原理

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      console.log('触发依赖收集');
      return val;
    },
    set: function reactiveSetter(newVal) {
      if (newVal === val) return;
      console.log('触发更新');
      val = newVal;
    }
  });
}

Vue 3.x 使用 Proxy 实现数据劫持,直接代理整个对象,无需递归遍历属性,性能更好且支持动态新增属性。

const observed = new Proxy(obj, {
  get(target, key, receiver) {
    console.log('触发依赖收集');
    return Reflect.get(target, key, receiver);
  },
  set(target, key, value, receiver) {
    console.log('触发更新');
    return Reflect.set(target, key, value, receiver);
  }
});

依赖收集

每个响应式数据属性关联一个 Dep 实例(依赖管理器)。在 getter 中,当前正在执行的 Watcher(订阅者)会被添加到 Dep 的订阅列表中。

vue实现数据监听原理

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

派发更新

当数据修改时,setter 会触发 Dep.notify(),通知所有订阅的 Watcher 执行更新操作。Watcher 可能是组件渲染函数、计算属性或用户自定义的 watch

class Watcher {
  update() {
    console.log('执行更新');
  }
}

数组监听

Vue 2.x 通过重写数组的变异方法(如 pushpop 等)实现数组监听。调用这些方法时,手动触发更新通知。

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);
['push', 'pop', 'shift'].forEach(method => {
  arrayMethods[method] = function(...args) {
    const result = arrayProto[method].apply(this, args);
    console.log('触发数组更新');
    return result;
  };
});

总结

  • Vue 2.x 基于 Object.defineProperty 实现数据劫持,需递归遍历对象属性。
  • Vue 3.x 使用 Proxy 代理整个对象,性能更优且支持动态属性。
  • 依赖收集通过 DepWatcher 实现,数据变化时触发订阅者更新。
  • 数组通过重写变异方法实现监听。

标签: 原理数据
分享给朋友:

相关文章

vue动画实现原理

vue动画实现原理

Vue动画实现原理 Vue的动画系统基于CSS过渡和动画,结合Vue的响应式系统,提供声明式的方式管理元素进入/离开的动画效果。核心原理分为以下几个部分: 过渡类名自动应用 Vue在元素插入…

vue extend实现原理

vue extend实现原理

Vue.extend 的实现原理 Vue.extend 是 Vue.js 中用于创建子类构造函数的全局方法,其核心原理基于 JavaScript 的原型继承机制。以下是其关键实现逻辑: 原型继承与构…

uniapp 广播数据

uniapp 广播数据

使用全局事件总线进行广播 在uniapp中,可以通过全局事件总线(EventBus)实现数据的广播和监听。创建一个全局的EventBus实例,在需要的地方触发事件和监听事件。 // 在main.j…

vue的原理实现

vue的原理实现

Vue 的核心原理实现 Vue.js 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现细节: 响应式系统 Vue 2.x 使用 Object.definePrope…

vue原理与实现

vue原理与实现

Vue 的核心原理 Vue 是一个渐进式 JavaScript 框架,其核心原理包括响应式系统、虚拟 DOM、模板编译和组件化设计。这些机制共同构成了 Vue 的高效开发模式。 响应式系统通过 O…

vue实现的原理

vue实现的原理

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现原理的关键部分: 响应式系统 Vue…