当前位置:首页 > 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 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 双向绑定实现原理 Vue 实现双向绑定的核心机制是数据劫持结合发布-订阅模式,主要通过 v-model 指令实现。以下是关键实现细节: 数据劫持(响应式系统) Vue 2.x 使用 Obj…

vue数据实现双向绑定

vue数据实现双向绑定

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

uniapp怎么给标签绑定颜色

uniapp怎么给标签绑定颜色

在 uniapp 中给标签绑定颜色 在 uniapp 中,可以通过动态绑定样式或类名的方式为标签设置颜色。以下是几种常见的方法: 动态绑定内联样式 使用 :style 绑定动态样式对象,直接在…

实现vue双向绑定

实现vue双向绑定

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

jquery事件绑定

jquery事件绑定

jQuery 事件绑定的基本方法 使用 on() 方法绑定事件是最推荐的方式,兼容性强且支持动态元素。语法如下: $(selector).on(eventName, handlerFunction)…

Vue数据绑定实现

Vue数据绑定实现

Vue 数据绑定的核心机制 Vue 的数据绑定基于响应式系统,通过 Object.defineProperty 或 Proxy 实现。当数据变化时,视图自动更新。 双向绑定的实现方式 v-mode…