当前位置:首页 > 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,在数据变化时触发更新。

vue双向实现原理

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 更新视图。

vue双向实现原理

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 事件监听。

<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 的双向绑定主要通过 v-model 指令实现,结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。以下是核心实现逻辑:…

vue rooter 实现原理

vue rooter 实现原理

Vue Router 实现原理 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。其核心实现原理包括路由匹配、组件渲染和导航守卫等机制。 路由匹配与动态路由…

vue如何实现原理

vue如何实现原理

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

vue模版实现原理

vue模版实现原理

Vue 模板实现原理 Vue 的模板实现原理主要涉及模板编译、虚拟 DOM 和响应式系统三个核心部分。以下是详细解析: 模板编译 Vue 模板通过编译器将模板字符串转换为渲染函数。这一过程分为以…

css制作图文混排原理

css制作图文混排原理

CSS 图文混排原理 图文混排主要通过 CSS 的浮动、定位、弹性布局或网格布局实现,核心是控制文本与图片的相对位置和环绕效果。 浮动(Float)实现环绕 使用 float 属性让图片浮动到左侧或…

vue实现双向绑定

vue实现双向绑定

Vue 双向绑定的实现原理 Vue 的双向绑定是通过 v-model 指令实现的,其本质是语法糖,结合了 v-bind(属性绑定)和 v-on(事件监听)。以下是具体实现方式: 使用 v-model…