当前位置:首页 > VUE

vue 双向实现原理

2026-02-18 13:35:30VUE

Vue 双向绑定的实现原理

Vue 的双向绑定主要通过数据劫持结合发布-订阅模式实现,核心是 v-model 指令和响应式系统。

数据劫持与响应式

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性,在属性被访问或修改时触发 getter/setter。例如:

// Vue 2 的简化实现
function defineReactive(obj, key) {
  let value = obj[key];
  Object.defineProperty(obj, key, {
    get() {
      console.log('读取数据');
      return value;
    },
    set(newVal) {
      if (newVal !== value) {
        console.log('更新数据');
        value = newVal;
        // 通知依赖更新
      }
    }
  });
}

依赖收集与发布订阅

每个响应式属性关联一个 Dep(依赖管理器),用于收集依赖该属性的 Watcher(订阅者)。当数据变化时,Dep 通知所有 Watcher 更新视图。

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

v-model 的实现

v-model 是语法糖,本质上是 value 属性绑定和 input 事件监听的组合。例如:

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

虚拟 DOM 与更新优化

数据变化后触发重新渲染,Vue 通过虚拟 DOM 的 diff 算法高效更新真实 DOM,减少性能开销。

双向绑定的关键点

  • 数据驱动视图:数据变化自动更新 DOM。
  • 视图影响数据:通过事件监听(如 input)修改数据。
  • 异步更新队列:Vue 将多次数据变更合并为一次视图更新,提高性能。

Vue 3 的改进

Vue 3 使用 Proxy 替代 Object.defineProperty,解决了无法监听新增属性和数组变化的问题,并提高了性能。例如:

const proxy = new Proxy(obj, {
  get(target, key) {
    track(target, key); // 依赖收集
    return target[key];
  },
  set(target, key, value) {
    target[key] = value;
    trigger(target, key); // 触发更新
  }
});

vue 双向实现原理

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

相关文章

eventbus实现原理vue

eventbus实现原理vue

EventBus 的实现原理(Vue) EventBus 是 Vue 中实现跨组件通信的一种简单机制,其核心原理基于发布-订阅模式(Pub-Sub)。以下是其实现的关键点: 核心机制 事件中心…

vue数组实现原理

vue数组实现原理

Vue 数组响应式原理 Vue 通过重写数组的原型方法来实现对数组变化的监听。Vue 没有直接监听数组的索引变化,而是通过拦截数组的变异方法(如 push、pop、splice 等)来触发视图更新。…

vue 实现原理

vue 实现原理

Vue 实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。 响应式系统 Vue 使用 Object.defin…

js实现原理

js实现原理

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

css动画制作原理

css动画制作原理

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

vue实现原理比较

vue实现原理比较

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