当前位置:首页 > VUE

.vue 双向绑定实现原理

2026-01-21 02:41:50VUE

Vue 双向绑定实现原理

Vue 的双向绑定核心是通过数据劫持结合发布-订阅模式实现的,主要依赖以下技术:

数据劫持(Object.defineProperty 或 Proxy)

Vue 2.x 使用 Object.defineProperty 对对象的属性进行劫持,通过重写属性的 getset 方法实现监听。Vue 3.x 改用 Proxy 实现更高效的劫持,支持对数组和深层对象的监听。

// Vue 2.x 的简单实现示例
const data = { value: '' };
Object.defineProperty(data, 'value', {
  get() {
    return this._value;
  },
  set(newVal) {
    this._value = newVal;
    console.log('数据更新了'); // 触发更新
  }
});

依赖收集与发布-订阅

每个被劫持的属性会关联一个 Dep(依赖收集器),用于存储所有依赖该属性的 Watcher(订阅者)。当数据变化时,Dep 会通知所有 Watcher 更新视图。

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target);
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub());
  }
}

模板编译与指令解析

Vue 的模板会被编译成渲染函数,解析到 v-model 等指令时:

  1. 为表单元素绑定 input 事件(如 text 类型输入框)。
  2. 通过 v-bind 将数据绑定到元素的 value 属性。
  3. 输入时触发事件更新数据,数据变化后触发重新渲染。

实现双向绑定的关键代码

// 简化的 v-model 实现
function bindInputToData(input, obj, key) {
  input.value = obj[key]; // 初始化
  input.addEventListener('input', (e) => {
    obj[key] = e.target.value; // 数据更新
  });
  // 假设这里有一个响应式系统监听 obj[key] 的变化
}

Vue 3 的优化

Vue 3 使用 Proxy 替代 Object.defineProperty,解决了以下问题:

  • 无需递归遍历对象初始化劫持。
  • 直接监听数组变化。
  • 支持动态新增属性。
// Vue 3 的 Proxy 实现
const reactive = (obj) => {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key); // 依赖收集
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key); // 触发更新
      return true;
    }
  });
};

总结

  1. 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  2. 依赖收集:在 getter 中收集依赖,在 setter 中触发更新。
  3. 模板编译:将模板中的指令解析为数据绑定和事件监听。
  4. 更新视图:数据变化时通过虚拟 DOM 高效更新界面。

.vue 双向绑定实现原理

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

相关文章

vue实现事件绑定的是

vue实现事件绑定的是

Vue 事件绑定实现方式 Vue 通过 v-on 指令或 @ 简写实现事件绑定,支持多种事件处理方式。 基础语法 <button v-on:click="handleClick">点击事…

实现vue双向绑定

实现vue双向绑定

Vue双向绑定的实现原理 Vue的双向绑定主要通过数据劫持结合发布-订阅模式实现。核心是利用Object.defineProperty()或ES6的Proxy来劫持各个属性的getter和setter…

vue实现绑定herf

vue实现绑定herf

Vue 中实现绑定 href 的方法 在 Vue 中绑定 href 属性可以通过多种方式实现,以下是几种常见的方法: 使用 v-bind 或简写 : 通过 v-bind 或简写 : 动态绑定 hre…

vue样式绑定实现收藏

vue样式绑定实现收藏

Vue 样式绑定实现收藏功能 在 Vue 中,可以通过动态绑定样式来实现收藏功能,常见的方法是使用 v-bind:class 或 v-bind:style 来切换样式状态。 使用 v-bind:cl…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 主要通过 v-model 指令实现双向绑定,适用于表单元素或自定义组件。以下是几种常见实现方式: 表单元素的双向绑定 在表单元素(如 input、textare…

vue 实现循环绑定

vue 实现循环绑定

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