当前位置:首页 > VUE

vue双向实现原理

2026-01-19 00:57:25VUE

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

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

数据劫持

Vue 2.x 使用 Object.defineProperty 劫持对象的属性访问和修改。通过定义属性的 gettersetter,在数据变化时触发更新。

let data = { name: 'Vue' };
Object.defineProperty(data, 'name', {
  get() {
    console.log('获取数据');
    return val;
  },
  set(newVal) {
    console.log('设置数据');
    val = newVal;
    // 触发更新
  }
});

Vue 3.x 改用 Proxy,可以直接监听整个对象而非属性,解决了 Vue 2.x 中无法监听新增属性的问题。

let data = { name: 'Vue' };
let proxy = new Proxy(data, {
  get(target, key) {
    console.log('获取数据');
    return target[key];
  },
  set(target, key, value) {
    console.log('设置数据');
    target[key] = value;
    // 触发更新
    return true;
  }
});

依赖收集与发布-订阅

每个响应式数据会维护一个依赖列表(Dep),用于存储所有依赖该数据的 Watcher 实例。当数据变化时,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. 初始化时,通过数据劫持监听数据变化。
  2. 编译模板时,为每个绑定创建 Watcher 并添加到对应数据的 Dep 中。
  3. 数据变化时,触发 setter,Dep 通知所有 Watcher 更新视图。
  4. 用户输入触发事件,更新数据,形成双向绑定循环。

Vue 3.x 的改进在于使用 Proxy 提高了响应式系统的性能和灵活性,同时引入了 Composition API 增强代码组织能力。

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

相关文章

vue如何实现原理

vue如何实现原理

Vue 的核心实现原理 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化。以下分模块详细说明其实现机制。 响应式系统 Vue 2.x 使用 Object.defineProper…

vue动画实现原理

vue动画实现原理

Vue动画实现原理 Vue的动画系统基于CSS过渡和动画,结合Vue的响应式系统,提供声明式的方式管理元素进入/离开的动画效果。核心原理分为以下几个部分: 过渡类名自动应用 Vue在元素插入…

vue分页实现原理

vue分页实现原理

Vue 分页实现原理 Vue 分页的核心原理是通过计算当前页的数据范围,动态渲染数据列表并控制分页组件的交互。以下是关键实现步骤: 数据分片计算 分页需要根据当前页码和每页条数截取数据。假设原始数据…

vue实现原理比较

vue实现原理比较

Vue 2 实现原理 Vue 2 的核心实现基于响应式系统和虚拟 DOM。响应式系统通过 Object.defineProperty 对数据进行劫持,当数据变化时触发依赖更新。虚拟 DOM 则通过 d…

vue事件实现原理

vue事件实现原理

Vue 事件实现原理 Vue 的事件系统基于发布-订阅模式,通过 $on、$emit 等方法实现组件间通信。以下是核心实现原理的分解: 事件注册与存储 Vue 实例内部通过 _events 对象存储…

vue router实现原理

vue router实现原理

Vue Router 的实现原理 Vue Router 是 Vue.js 的官方路由管理器,其核心原理基于前端路由的两种模式:Hash 模式和 History 模式。以下是其实现的关键点: Hash…