当前位置:首页 > VUE

Vue数据依赖实现

2026-03-28 04:02:01VUE

Vue 数据依赖实现原理

Vue 的数据依赖实现基于响应式系统,核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据变化,结合观察者模式(Watcher)和依赖收集(Dep)完成。

核心模块

  1. Observer
    递归遍历数据对象,为每个属性添加 getter/setter。
    getter 触发依赖收集,setter 触发通知更新。

  2. Dep(依赖收集器)
    每个属性对应一个 Dep 实例,用于存储所有依赖该属性的 Watcher。

    Vue数据依赖实现

  3. Watcher(观察者)
    代表一个依赖,当数据变化时触发回调(如视图更新)。

代码示例(Vue 2 实现)

class Dep {
  constructor() {
    this.subs = new Set();
  }
  addSub(watcher) {
    this.subs.add(watcher);
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

function observe(obj) {
  Object.keys(obj).forEach(key => {
    let value = obj[key];
    const dep = new Dep();
    Object.defineProperty(obj, key, {
      get() {
        if (Dep.target) dep.addSub(Dep.target);
        return value;
      },
      set(newVal) {
        if (newVal === value) return;
        value = newVal;
        dep.notify();
      }
    });
  });
}

class Watcher {
  constructor(getter) {
    this.getter = getter;
    this.get();
  }
  get() {
    Dep.target = this;
    this.value = this.getter();
    Dep.target = null;
  }
  update() {
    this.get();
  }
}

流程说明

  1. 初始化阶段
    observe(data) 将数据转为响应式,每个属性绑定 Dep。

    Vue数据依赖实现

  2. 依赖收集
    模板编译或 computed 触发 getter,当前 Watcher 被记录到 Dep 中。

  3. 触发更新
    数据修改时 setter 调用 dep.notify(),通知所有 Watcher 执行更新。

Vue 3 优化

  • 使用 Proxy 代理整个对象,无需递归遍历。
  • 惰性响应:仅在访问属性时触发依赖收集。
  • 性能提升:减少初始化开销,支持动态新增属性。

注意事项

  • 数组需特殊处理(重写变异方法如 push/pop)。
  • 对象新增属性需用 Vue.set(Vue 2)或直接赋值(Vue 3)。

标签: 数据Vue
分享给朋友:

相关文章

vue 数据绑定实现

vue 数据绑定实现

Vue 数据绑定的实现方式 Vue.js 通过数据绑定实现了视图与数据的自动同步,核心机制基于响应式系统。以下是 Vue 数据绑定的主要实现方式: 双向数据绑定(v-model) v-model 是…

Vue数据依赖实现

Vue数据依赖实现

Vue数据依赖实现原理 Vue的数据依赖实现基于响应式系统,核心是通过Object.defineProperty或Proxy拦截数据变化,结合发布-订阅模式实现依赖收集和更新触发。 核心机制 依赖收…

Vue查看全文实现

Vue查看全文实现

Vue 查看全文实现方法 在Vue中实现查看全文功能通常涉及文本截断和展开/折叠操作,以下是几种常见实现方式: 使用CSS控制文本显示 通过CSS的text-overflow和line-clamp属…

vue实现数据添加

vue实现数据添加

在 Vue 中实现数据添加 Vue 提供了多种方式来实现数据的添加操作,可以通过组件的数据绑定、表单处理以及状态管理等方式完成。以下是几种常见的实现方法: 使用 v-model 绑定表单数据 通过…

vue实现数据动态

vue实现数据动态

Vue 实现数据动态绑定的方法 Vue.js 的核心特性之一是数据绑定,通过响应式系统实现数据的动态更新。以下是几种常见的实现方式: 双向数据绑定(v-model) 使用 v-model 指令可以实…

vue实现数据筛选

vue实现数据筛选

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