当前位置:首页 > VUE

.vue 双向绑定实现原理

2026-02-21 18:14:38VUE

Vue 双向绑定实现原理

Vue 的双向绑定是通过数据劫持结合发布-订阅模式实现的,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。以下是具体实现机制:

数据劫持

Vue 2.x 使用 Object.defineProperty 对数据的 gettersetter 进行拦截。当访问数据时触发 getter,修改数据时触发 setter

Object.defineProperty(obj, key, {
  get() {
    return value;
  },
  set(newVal) {
    if (newVal === value) return;
    value = newVal;
    // 触发更新
  }
});

Vue 3.x 改用 Proxy 实现更高效的数据劫持,支持对数组和对象深层属性的监听。

.vue 双向绑定实现原理

const proxy = new Proxy(obj, {
  get(target, key) {
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    Reflect.set(target, key, value);
    // 触发更新
  }
});

依赖收集与发布-订阅

每个数据属性关联一个 Dep(依赖管理器),用于收集依赖(Watcher)。当数据变化时,Dep 通知所有 Watcher 更新视图。

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

模板编译

Vue 模板编译时,解析指令(如 v-model)并生成对应的 Watcher。例如 v-model 会为元素绑定 input 事件,同时监听数据变化更新 DOM。

.vue 双向绑定实现原理

// 简化的 v-model 实现
input.addEventListener('input', (e) => {
  data.value = e.target.value;
});
new Watcher(data, 'value', (val) => {
  input.value = val;
});

虚拟 DOM 与更新优化

数据变化后触发 Watcher 更新,通过虚拟 DOM 的 diff 算法计算出最小变更,再批量更新真实 DOM,提高性能。

// 简化的更新流程
updateComponent() {
  const vnode = render();
  patch(oldVnode, vnode);
}

双向绑定的实现示例

以下是一个极简的双向绑定实现:

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

class Watcher {
  constructor(vm, key, cb) {
    Dep.target = this;
    this.cb = cb;
    vm[key]; // 触发 getter 收集依赖
    Dep.target = null;
  }
  update() {
    this.cb();
  }
}

总结

Vue 双向绑定的核心是通过数据劫持监听变化,结合依赖收集和发布-订阅模式实现数据与视图的自动同步。Vue 3.x 的 Proxy 方案解决了 Vue 2.x 中无法监听新增属性和数组索引变化的问题,性能更优。

标签: 绑定双向
分享给朋友:

相关文章

vue 实现循环绑定

vue 实现循环绑定

Vue 实现循环绑定的方法 在 Vue 中,可以通过 v-for 指令实现循环绑定,用于渲染列表或对象数据。以下是几种常见的实现方式: 数组循环绑定 使用 v-for 遍历数组,可以通过索引或直接…

vue实现数组绑定

vue实现数组绑定

Vue 数组绑定的实现方法 Vue 提供了多种方式实现数组的响应式绑定,确保数据变化时视图自动更新。以下是常见的实现方法: 使用 v-for 指令渲染数组 通过 v-for 指令可以遍历数组并渲染…

vue怎么实现绑定

vue怎么实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现单向数据绑定(数据从模型到视图),语法为 v-bind:属性="数据" 或简写为 :属性="数据"。例如绑定 src 属性: <img…

vue实现绑定页面

vue实现绑定页面

Vue 实现数据绑定到页面的方法 Vue.js 通过数据绑定机制实现数据和页面的同步更新,主要依赖响应式系统和模板语法。以下是几种常见的绑定方式: 双向绑定 (v-model) 使用 v-model…

怎么实现vue双向绑定

怎么实现vue双向绑定

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 使用 v-…

vue怎样实现数组绑定

vue怎样实现数组绑定

Vue 实现数组绑定的方法 Vue 提供了多种方式来实现数组的绑定,以下是常见的几种方法: 使用 v-for 指令绑定数组 通过 v-for 指令可以遍历数组并渲染列表。语法如下: <ul&…