当前位置:首页 > VUE

vue双向绑定实现逻辑

2026-02-24 17:38:34VUE

Vue 双向绑定的实现逻辑

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

核心实现步骤

数据劫持(Data Observer) 通过 Object.definePropertyProxy 拦截对象的属性访问和修改。当数据被读取时,触发 getter 并收集依赖;当数据被修改时,触发 setter 并通知依赖更新。

// Vue 2.x 使用 Object.defineProperty
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`更新 ${key}`);
        val = newVal;
      }
    }
  });
}

依赖收集(Dependency Tracking) 每个响应式数据维护一个依赖列表(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());
  }
}

Watcher(订阅者) Watcher 是数据和视图之间的桥梁。当模板或计算属性中读取数据时,会创建一个 Watcher 并订阅数据的变化。数据变化时,Watcher 触发回调更新视图。

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

双向绑定的实现

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,解决了无法监听新增属性和数组变化的问题:

vue双向绑定实现逻辑

// Vue 3.x 使用 Proxy
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key);
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      Reflect.set(target, key, value);
      trigger(target, key);
    }
  });
}

总结

  1. 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  2. 依赖收集:在数据读取时收集依赖(Watcher),存储到 Dep 中。
  3. 派发更新:数据变化时通知 Dep,触发所有 Watcher 更新视图。
  4. v-model:通过 :value 绑定数据和 @input 监听输入事件实现双向绑定。

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

相关文章

vue样式绑定实现收藏

vue样式绑定实现收藏

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

vue 双向实现原理

vue 双向实现原理

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。以下是具体实现机制…

vue实现数据双向

vue实现数据双向

在Vue中实现数据双向绑定主要依靠v-model指令,它结合了属性绑定和事件监听,适用于表单元素或自定义组件。以下是具体实现方式: 基础表单元素的双向绑定 对于原生表单元素(如input、texta…

vue实现绑定页面

vue实现绑定页面

Vue 实现数据绑定到页面的方法 Vue.js 通过数据绑定机制实现数据和页面的同步更新,主要依赖响应式系统和模板语法。以下是几种常见的绑定方式: 双向绑定 (v-model) 使用 v-model…

vue怎么实现双向

vue怎么实现双向

Vue 双向绑定的实现方式 Vue 中实现双向绑定的核心机制是 v-model 指令,它结合了属性绑定和事件监听,适用于表单元素或自定义组件。 表单元素的双向绑定 在原生表单元素(如 input、s…

vue如何实现表单绑定

vue如何实现表单绑定

Vue 表单绑定实现方法 Vue 提供了 v-model 指令实现表单元素的双向数据绑定,适用于多种输入类型。 文本输入框绑定 <input type="text" v-model="mess…