当前位置:首页 > VUE

vue双向数据绑定实现

2026-01-20 03:34:37VUE

双向数据绑定的概念

双向数据绑定是指视图(View)与模型(Model)之间的双向同步。当数据发生变化时,视图自动更新;当用户操作视图时,数据也会自动更新。Vue 通过 v-model 指令实现双向数据绑定。

Vue 2.x 的实现方式

Vue 2.x 使用 Object.defineProperty 实现数据劫持,结合发布-订阅模式完成双向绑定。

数据劫持

通过 Object.defineProperty 劫持对象的属性,在属性被访问或修改时触发 getter 和 setter。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`get ${key}: ${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`set ${key}: ${newVal}`);
        val = newVal;
      }
    }
  });
}

依赖收集与派发更新

Vue 通过 Dep(依赖管理器)和 Watcher(观察者)实现依赖收集与派发更新。

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  constructor() {
    Dep.target = this;
  }
  update() {
    console.log('视图更新');
  }
}

实现 v-model

v-model 是语法糖,本质上是 :value@input 的结合。

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

Vue 3.x 的实现方式

Vue 3.x 使用 Proxy 替代 Object.defineProperty,提供了更好的性能和更全面的劫持能力。

数据劫持

Proxy 可以直接监听整个对象,无需递归遍历属性。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log(`get ${key}: ${target[key]}`);
      return target[key];
    },
    set(target, key, value) {
      console.log(`set ${key}: ${value}`);
      target[key] = value;
      return true;
    }
  });
}

响应式系统

Vue 3.x 的响应式系统基于 effecttrack/trigger 机制。

const targetMap = new WeakMap();

function track(target, key) {
  let depsMap = targetMap.get(target);
  if (!depsMap) {
    targetMap.set(target, (depsMap = new Map()));
  }
  let dep = depsMap.get(key);
  if (!dep) {
    depsMap.set(key, (dep = new Set()));
  }
  dep.add(effect);
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const dep = depsMap.get(key);
  if (dep) {
    dep.forEach(effect => effect());
  }
}

对比与总结

  • Vue 2.x:基于 Object.defineProperty,需要递归遍历对象,对数组需特殊处理。
  • Vue 3.x:基于 Proxy,性能更好,支持直接监听数组和动态新增属性。

双向数据绑定的核心是数据劫持 + 发布-订阅模式,通过监听数据变化自动更新视图,同时监听用户输入更新数据。

vue双向数据绑定实现

标签: 绑定双向
分享给朋友:

相关文章

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

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

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

vue实现双向绑定

vue实现双向绑定

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

vue样式绑定实现收藏

vue样式绑定实现收藏

Vue 样式绑定实现收藏功能 在 Vue 中,可以通过动态绑定样式来实现收藏功能,常见的方法是使用 v-bind:class 或 v-bind:style 来切换样式状态。 使用 v-bind:c…

vue实现双向绑定的是

vue实现双向绑定的是

Vue 双向绑定实现原理 Vue 实现双向绑定的核心机制是数据劫持结合发布-订阅模式,主要通过 v-model 指令实现。以下是关键实现细节: 数据劫持(响应式系统) Vue 2.x 使用 Obje…

vue数据实现双向绑定

vue数据实现双向绑定

Vue 数据双向绑定的实现原理 Vue 的数据双向绑定主要通过 v-model 指令实现,结合了数据绑定和事件监听。以下是核心实现方式: 使用 v-model 指令 v-model 是语法糖,自动绑…

vue 绑定实现

vue 绑定实现

Vue 数据绑定实现 Vue 的数据绑定主要通过响应式系统和模板编译实现,以下是核心实现方式: 双向绑定 (v-model) 适用于表单元素,自动同步输入值与 Vue 实例数据: <in…