当前位置:首页 > 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的双向绑定主要通过数据劫持结合发布-订阅模式实现。核心是利用Object.defineProperty()或ES6的Proxy来劫持各个属性的getter和setter…

vue双向实现

vue双向实现

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

vue实现绑定herf

vue实现绑定herf

在 Vue 中绑定 href 的方法 Vue 中可以通过 v-bind 指令或简写 : 动态绑定 href 属性,支持绑定静态值、动态变量或计算属性。 静态绑定 <a href="https…

vue实现数组绑定

vue实现数组绑定

Vue 数组绑定的实现方法 Vue 提供了多种方式实现数组的响应式绑定,确保数据变化时视图自动更新。以下是常见的实现方法: 使用 v-for 指令渲染数组 通过 v-for 指令可以遍历数组并渲染…

vue 实现双向绑定

vue 实现双向绑定

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,底层基于数据劫持和发布-订阅模式。以下是核心实现机制: 数据劫持(响应式系统) Vue 使用 Object.defi…

实现vue数据绑定

实现vue数据绑定

Vue数据绑定的实现方式 Vue.js通过数据劫持和发布-订阅模式实现数据绑定,核心是响应式系统。以下是主要实现方法: 双向数据绑定(v-model) <input v-model="mess…