当前位置:首页 > VUE

vue 双向实现原理

2026-03-10 02:52:56VUE

Vue 双向绑定的实现原理

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

数据劫持

通过 Object.definePropertyProxy 拦截对象的属性读写操作,在属性被访问或修改时触发相应的逻辑。

// Vue 2.x 使用 Object.defineProperty
const data = { value: '' };
Object.defineProperty(data, 'value', {
  get() {
    return this._value;
  },
  set(newValue) {
    this._value = newValue;
    // 触发更新
  }
});

依赖收集

每个响应式属性都有一个依赖列表(Dep),用于存储所有依赖于该属性的 Watcher 实例。当属性被访问时,当前 Watcher 会被添加到依赖列表中。

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

发布-订阅模式

当数据变化时,Dep 会通知所有 Watcher 执行更新操作。Watcher 负责将新数据渲染到视图或更新模型。

function watcher(fn) {
  target = fn;
  fn();
  target = null;
}

双向绑定实现

通过 v-model 指令将表单元素的值与 Vue 实例的数据绑定。表单输入时触发 input 事件更新数据,数据变化时通过响应式系统更新视图。

// 简化版 v-model 实现
<input v-model="message" />

// 等价于
<input :value="message" @input="message = $event.target.value" />

Vue 3 的改进

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

vue 双向实现原理

  • 无法检测到对象属性的添加或删除。
  • 对数组的索引修改和长度变化无法监听。
  • Proxy 可以直接监听整个对象,无需递归遍历属性。
// Vue 3 使用 Proxy
const data = new Proxy({ value: '' }, {
  get(target, key) {
    return target[key];
  },
  set(target, key, value) {
    target[key] = value;
    // 触发更新
    return true;
  }
});

总结

Vue 的双向绑定通过数据劫持、依赖收集和发布-订阅模式实现,v-model 是语法糖,底层通过事件监听和属性绑定完成。Vue 3 的 Proxy 提供了更强大的响应式能力。

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

相关文章

css制作图文混排原理

css制作图文混排原理

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

vue实现放大镜原理

vue实现放大镜原理

Vue 实现放大镜原理 实现放大镜效果的核心原理是通过鼠标移动事件获取位置信息,动态计算放大区域并显示放大后的图像。以下是基于 Vue 的实现方法: 基本结构设计 HTML 部分需包含原图容器、放大…

vue双向实现数据

vue双向实现数据

Vue 双向数据绑定的实现 Vue 的双向数据绑定主要通过 v-model 指令实现,它结合了 v-bind 和 v-on 的功能,能够同步表单输入和应用状态。 基本语法 在表单元素上使用 v-mo…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过改变元素的样式属性实现动态效果,主要依赖关键帧(@keyframes)和动画属性(如animation-name、animation-duration)的配合。核心原…

vue bus实现原理

vue bus实现原理

Vue 事件总线(Bus)实现原理 Vue 事件总线(Bus)是一种跨组件通信的机制,通常用于非父子组件之间的数据传递。其核心原理基于 Vue 实例的事件系统。 核心机制 Vue 事件总线通过创建一…