当前位置:首页 > VUE

vue 双向实现原理

2026-01-17 21:08:32VUE

Vue 双向绑定的实现原理

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

数据劫持

Vue 2.x 使用 Object.defineProperty 劫持对象的属性,Vue 3.x 改用 Proxy 代理整个对象。当数据发生变化时,触发 setter 或 Proxy 的捕获器,通知依赖更新。

Vue 2.x 示例:

vue 双向实现原理

let data = { value: '' };
Object.defineProperty(data, 'value', {
  get() {
    return this._value;
  },
  set(newVal) {
    this._value = newVal;
    console.log('数据更新了'); // 触发视图更新
  }
});

Vue 3.x 示例:

let data = { value: '' };
let proxy = new Proxy(data, {
  set(target, key, value) {
    target[key] = value;
    console.log('数据更新了'); // 触发视图更新
    return true;
  }
});

发布-订阅模式

  1. 依赖收集:在编译模板时,解析 v-model 指令,为表单元素(如 input)绑定事件监听(如 input 事件)。
  2. 通知更新:当数据变化时,触发 setter/Proxy,通知所有订阅该数据的 Watcher 更新视图。

简单实现:

vue 双向实现原理

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

let dep = new Dep();
let target = null;

function watcher(fn) {
  target = fn;
  dep.depend();
  fn();
  target = null;
}

v-model 的工作流程

  1. 模板编译:将 v-model="message" 解析为 :value="message"@input="message = $event.target.value"
  2. 数据绑定:表单元素的值与数据属性 message 动态关联。
  3. 事件监听:用户输入时触发 input 事件,更新数据属性,进而触发视图重新渲染。

示例代码:

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

不同表单元素的适配

  • `:绑定 value 属性和 input 事件。
  • <checkbox>:绑定 checked 属性和 change 事件。
  • <select>:绑定 value 属性和 change 事件。

Vue 内部会根据元素类型自动选择对应的属性和事件。

总结

Vue 的双向绑定本质是语法糖,通过数据劫持监听数据变化,结合发布-订阅模式实现视图与数据的自动同步。v-model 简化了手动绑定值和事件的代码,提升开发效率。

标签: 双向原理
分享给朋友:

相关文章

vue动态渲染实现原理

vue动态渲染实现原理

Vue 动态渲染实现原理 Vue 的动态渲染主要依赖于其响应式系统和虚拟 DOM 技术。以下是核心实现原理的详细分析: 响应式系统 Vue 通过 Object.defineProperty(Vue…

vue顶层实现原理

vue顶层实现原理

Vue 顶层实现原理 Vue 的核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键原理的分解: 响应式系统 Vue 通过 Object.defineProperty(V…

vue nextick实现原理

vue nextick实现原理

Vue nextTick 实现原理 Vue 的 nextTick 是一个用于在 DOM 更新完成后执行回调的 API。其核心原理基于 JavaScript 的事件循环机制,确保回调在 DOM 更新后的…

vue组件实现原理

vue组件实现原理

Vue 组件实现原理 Vue 组件的核心实现基于以下机制: 组件注册与模板解析 Vue 组件通过 Vue.component() 或单文件组件(.vue 文件)注册。模板会被编译成渲染函数,最终生成…

ref实现原理vue

ref实现原理vue

ref 的实现原理(Vue 3) 在 Vue 3 中,ref 是响应式系统的核心 API 之一,用于将基本类型或对象转换为响应式引用。其实现依赖于 ES6 的 Proxy 和 getter/sette…

vue filter实现原理

vue filter实现原理

Vue Filter 的实现原理 Vue 过滤器(Filter)是一种用于文本格式化的功能,可以在模板中通过管道符 | 调用。其核心原理基于模板编译和运行时处理。 编译阶段处理 在模板编译阶段,Vu…