当前位置:首页 > VUE

vue双向绑定如何实现

2026-01-20 12:50:10VUE

Vue 双向绑定的实现原理

Vue 的双向绑定是通过数据劫持结合发布者-订阅者模式实现的,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。

Vue 2.x 的实现方式

数据劫持
使用 Object.defineProperty 劫持对象的属性,在属性被访问或修改时触发 gettersetter

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get() {
      console.log('get value:', val);
      return val;
    },
    set(newVal) {
      console.log('set value:', newVal);
      val = newVal;
    }
  });
}

依赖收集
getter 中收集依赖(Watcher),在 setter 中通知依赖更新。

vue双向绑定如何实现

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

Watcher
Watcher 是观察者,负责更新视图。

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

Vue 3.x 的实现方式

Proxy 替代 Object.defineProperty
Vue 3.x 使用 Proxy 实现数据劫持,可以监听对象和数组的变化,无需递归遍历对象。

vue双向绑定如何实现

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

Reflect 配合 Proxy
使用 Reflect 操作对象,避免直接操作原对象。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      const res = Reflect.get(target, key, receiver);
      track(target, key); // 依赖收集
      return res;
    },
    set(target, key, value, receiver) {
      const res = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return res;
    }
  });
}

双向绑定的具体应用

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

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

自定义组件的双向绑定
通过 model 选项和 $emit 实现自定义组件的双向绑定。

Vue.component('custom-input', {
  props: ['value'],
  model: {
    prop: 'value',
    event: 'input'
  },
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    />
  `
});

总结

Vue 的双向绑定通过数据劫持和发布-订阅模式实现,Vue 2.x 使用 Object.defineProperty,Vue 3.x 使用 Proxyv-model 是语法糖,简化了表单输入和组件通信的双向绑定逻辑。

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

相关文章

vue实现绑定页面

vue实现绑定页面

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

实现vue数据绑定

实现vue数据绑定

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

vue双向绑定实现方式

vue双向绑定实现方式

Vue 双向绑定的实现方式 Vue 的双向绑定主要通过 v-model 指令实现,结合数据劫持和发布-订阅模式完成数据与视图的同步更新。以下是核心实现原理及方式: 数据劫持(响应式原理) Vue 使…

vue 双向绑定 实现原理

vue 双向绑定 实现原理

Vue 双向绑定的实现原理 Vue 的双向绑定是通过数据劫持结合发布者-订阅者模式实现的,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。以下是具…

vue怎样实现数组绑定

vue怎样实现数组绑定

Vue 实现数组绑定的方法 Vue 提供了多种方式来实现数组的绑定,以下是常见的几种方法: 使用 v-for 指令绑定数组 通过 v-for 指令可以遍历数组并渲染列表。语法如下: <ul&…

vue自己实现双向绑定

vue自己实现双向绑定

实现 Vue 双向绑定的核心原理 双向绑定的核心是通过数据劫持结合发布-订阅模式实现的。主要涉及 Object.defineProperty 或 Proxy 来监听数据变化,并通过观察者模式通知视图更…