当前位置:首页 > VUE

vue实现双向数据绑定的原理

2026-02-09 09:27:48VUE

Vue 双向数据绑定的原理

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

数据劫持

通过 Object.definePropertyProxy 劫持数据的 gettersetter,在数据变化时触发更新。Vue 2.x 使用 Object.defineProperty 递归遍历对象属性,为每个属性添加 getter/setter

// Vue 2.x 数据劫持示例
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('get:', val);
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      console.log('set:', newVal);
      val = newVal;
      // 触发更新
    },
  });
}

Vue 3.x 改用 Proxy,直接代理整个对象,无需递归,性能更好。

// Vue 3.x 数据劫持示例
const handler = {
  get(target, key) {
    console.log('get:', target[key]);
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    if (target[key] === value) return true;
    console.log('set:', value);
    Reflect.set(target, key, value);
    // 触发更新
    return true;
  },
};
const proxy = new Proxy(target, handler);

依赖收集与发布-订阅

getter 中收集依赖(Watcher),在 setter 中通知依赖更新。Vue 的 Dep 类管理依赖,Watcher 是观察者,负责更新视图。

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

class Watcher {
  update() {
    // 更新视图
  }
}

模板编译

Vue 将模板编译为渲染函数,解析指令(如 v-model)。v-model 是语法糖,本质是 :value 绑定和 @input 事件监听的组合。

vue实现双向数据绑定的原理

<input v-model="message">
<!-- 等价于 -->
<input :value="message" @input="message = $event.target.value">

整体流程

  1. 初始化阶段:劫持数据,编译模板,创建 Watcher
  2. 依赖收集:渲染时触发 getterDep 收集当前 Watcher
  3. 更新阶段:数据变化触发 setterDep 通知 Watcher 更新视图。

对比 Vue 2.x 与 3.x

  • Vue 2.x:基于 Object.defineProperty,需递归遍历对象,无法监听数组索引和 length 变化,需额外处理。
  • Vue 3.x:基于 Proxy,支持动态新增属性,性能更优,无需手动处理数组。

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

相关文章

vue实现绑定herf

vue实现绑定herf

在 Vue 中绑定 href 的方法 Vue 中可以通过 v-bind 指令或简写 : 动态绑定 href 属性,支持绑定静态值、动态变量或计算属性。 静态绑定 <a href="https…

实现vue动态绑定

实现vue动态绑定

动态绑定的基本语法 在Vue中,使用v-bind指令或简写:实现动态绑定,将数据属性与HTML元素的属性关联起来。例如动态绑定class或style: <div v-bind:class="{…

vue双向绑定实现方式

vue双向绑定实现方式

Vue 双向绑定的实现方式 Vue 的双向绑定主要通过 v-model 指令实现,结合数据劫持和发布-订阅模式完成数据与视图的同步更新。以下是核心实现原理及方式: 数据劫持(响应式原理) Vue 使…

vue中实现双向数据

vue中实现双向数据

Vue 中实现双向数据绑定的方法 使用 v-model 指令 v-model 是 Vue 提供的语法糖,用于在表单元素上实现双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素的值。 <…

vue实现style双向绑定

vue实现style双向绑定

Vue 实现 Style 双向绑定 在 Vue 中实现 style 的双向绑定可以通过动态绑定 :style 属性来实现。Vue 提供了多种方式动态绑定样式,包括对象语法和数组语法。 对象语法 通过…

vue实现数据双向绑定

vue实现数据双向绑定

Vue 数据双向绑定的实现原理 Vue 的数据双向绑定主要通过 v-model 指令实现,其核心是基于数据劫持和发布-订阅模式。以下是关键实现机制: 数据劫持(响应式原理) Vue 使用 Objec…