当前位置:首页 > VUE

vue实现数据监听原理

2026-02-25 03:50:00VUE

Vue 数据监听原理

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

数据劫持

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

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 的订阅列表中。

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 等)实现数组监听。调用这些方法时,手动触发更新通知。

vue实现数据监听原理

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.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

vue双向实现数据

vue双向实现数据

Vue 双向数据绑定的实现 Vue 的双向数据绑定主要通过 v-model 指令实现,它结合了 v-bind 和 v-on 的功能,能够同步表单输入和应用状态。 基本语法 在表单元素上使用 v-mo…

vue computed 实现原理

vue computed 实现原理

Vue Computed 实现原理 Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心实现依赖于 Vue 的响应式系统和依赖收集机制。 依赖收集与缓存机制 computed 属性在…

vue实现原理书籍

vue实现原理书籍

以下是关于Vue实现原理的推荐书籍和学习资源,涵盖核心机制、源码解析及实践应用: 深入理解Vue核心机制 《Vue.js设计与实现》 作者霍春阳,系统剖析Vue 3的响应式系统、虚拟DOM、编译器等…

理解vue实现原理

理解vue实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现基于响应式系统、虚拟 DOM 和组件化设计。通过数据劫持结合发布-订阅模式实现数据驱动视图的更新。 响应式系统 Vue 使用 Object.def…