当前位置:首页 > VUE

js实现vue双向绑定

2026-02-25 04:14:44VUE

实现 Vue 双向绑定的核心原理

Vue 的双向绑定主要通过数据劫持结合发布-订阅模式实现,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。以下是简化版的实现思路:

数据劫持(响应式原理)

使用 Object.defineProperty 劫持对象的属性访问和修改:

function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) {
        dep.addSub(Dep.target); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}

依赖收集(发布-订阅模式)

实现一个简单的依赖收集器:

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

Dep.target = null; // 静态属性指向当前 Watcher

观察者(Watcher)

Watcher 负责更新视图:

class Watcher {
  constructor(vm, exp, fn) {
    this.vm = vm;
    this.exp = exp;
    this.fn = fn;
    Dep.target = this;
    this.vm[exp]; // 触发 getter 收集依赖
    Dep.target = null;
  }
  update() {
    this.fn(this.vm[this.exp]);
  }
}

双向绑定实现示例

结合以上代码实现简单版双向绑定:

<input id="input" type="text">
<div id="text"></div>
const data = { text: '' };
const input = document.getElementById('input');
const text = document.getElementById('text');

// 数据劫持
defineReactive(data, 'text', data.text);

// 数据 -> 视图
new Watcher(data, 'text', val => {
  text.innerText = val;
});

// 视图 -> 数据
input.addEventListener('input', e => {
  data.text = e.target.value;
});

使用 Proxy 的实现(Vue 3.x 风格)

Vue 3.x 改用 Proxy 实现响应式:

js实现vue双向绑定

function reactive(obj) {
  const dep = new Dep();
  return new Proxy(obj, {
    get(target, key) {
      if (Dep.target) dep.addSub(Dep.target);
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      const result = Reflect.set(target, key, value);
      dep.notify();
      return result;
    }
  });
}

完整流程说明

  1. 初始化时通过数据劫持监听所有属性
  2. 编译模板时创建 Watcher 并触发 getter 收集依赖
  3. 数据变化时通过 setter 触发依赖更新
  4. 用户输入通过事件监听反向更新数据

这种方法实现了数据与视图的自动同步,是 Vue 响应式系统的核心设计。实际 Vue 源码中还包含虚拟 DOM、批量异步更新等优化策略。

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

相关文章

jquery事件绑定

jquery事件绑定

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

vue实现双休绑定

vue实现双休绑定

Vue 实现双向绑定 Vue.js 通过 v-model 指令实现双向绑定,主要用于表单输入元素(如 <input>、<textarea>、<select>)与组件…

实现vue数据绑定

实现vue数据绑定

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

实现vue数组双向绑定

实现vue数组双向绑定

Vue 数组双向绑定的实现方法 Vue 通过数据劫持和发布-订阅模式实现数据的双向绑定,但直接修改数组的某些方法(如索引赋值)无法触发视图更新。以下是实现数组双向绑定的几种方法: 使用 Vue.se…

vue双向绑定实现方式

vue双向绑定实现方式

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

vue双向数据绑定实现

vue双向数据绑定实现

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