当前位置:首页 > VUE

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

2026-02-25 14:40:10VUE

Vue 双向数据绑定的原理

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

数据劫持(响应式系统)

Vue 通过劫持对象的属性,在属性被访问或修改时触发更新。

Vue 2.x 使用 Object.defineProperty

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}: ${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key}: ${newVal}`);
        val = newVal;
        // 触发视图更新
      }
    }
  });
}

Vue 3.x 使用 Proxy

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key, receiver) {
      console.log(`读取 ${key}`);
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      console.log(`设置 ${key}: ${value}`);
      Reflect.set(target, key, value, receiver);
      // 触发视图更新
      return true;
    }
  });
};

依赖收集与发布-订阅

Vue 通过 Dep(依赖收集器)Watcher(观察者) 实现数据变化时的视图更新。

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

  1. Dep(依赖收集器)
    每个响应式属性对应一个 Dep 实例,用于存储依赖该属性的 Watcher

    class Dep {
      constructor() {
        this.subscribers = [];
      }
      depend() {
        if (target && !this.subscribers.includes(target)) {
          this.subscribers.push(target);
        }
      }
      notify() {
        this.subscribers.forEach(sub => sub());
      }
    }
  2. Watcher(观察者)
    在模板编译时,为每个需要更新的 DOM 节点创建 Watcher,订阅数据变化。

    let target = null;
    function watcher(fn) {
      target = fn;
      fn(); // 首次执行触发 getter,收集依赖
      target = null;
    }

双向绑定的实现(v-model)

v-model 是语法糖,本质是 :value 绑定和 @input 监听的组合:

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

<input v-model="message">
<!-- 等价于 -->
<input :value="message" @input="message = $event.target.value">
  1. 初始化阶段

    • 通过数据劫持监听 message 的变化。
    • 编译模板时,为 input 创建 Watcher,订阅 messageDep
  2. 数据更新流程

    • 用户输入触发 @input,修改 message
    • messagesetter 调用 Dep.notify(),通知所有 Watcher 更新视图。

Vue 3.x 的优化

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

  • 无需递归遍历对象属性,性能更高。
  • 直接监听数组变化,无需重写数组方法。
  • 支持动态新增/删除属性。

总结

  1. 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  2. 依赖收集DepWatcher 实现数据与视图的关联。
  3. 双向绑定v-model 结合 :value@input 实现表单控件与数据的同步。

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

相关文章

vue 数据绑定实现

vue 数据绑定实现

Vue 数据绑定的实现方式 Vue 的数据绑定主要通过响应式系统和模板语法实现,以下是核心方法: 双向数据绑定(v-model) 通过 v-model 指令实现表单元素与数据的双向绑定,自动同步数据…

实现vue双向绑定

实现vue双向绑定

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

vue 双向实现原理

vue 双向实现原理

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

vue双向数据绑定实现

vue双向数据绑定实现

双向数据绑定的概念 双向数据绑定是指视图(View)与模型(Model)之间的双向同步。当数据发生变化时,视图自动更新;当用户操作视图时,数据也会自动更新。Vue 通过 v-model 指令实现双向数…

vue数据绑定实现网页

vue数据绑定实现网页

Vue 数据绑定实现网页 Vue.js 通过数据绑定机制实现动态网页,核心是利用响应式系统将数据与 DOM 关联。以下是关键实现方式: 双向数据绑定(v-model) 通过 v-model 指令实现…

vue自己实现双向绑定

vue自己实现双向绑定

实现 Vue 双向绑定的核心原理 双向绑定的核心是通过数据劫持结合发布-订阅模式实现的。主要涉及 Object.defineProperty 或 Proxy 来监听数据变化,并通过观察者模式通知视图更…