当前位置:首页 > 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 实现响应式:

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、批量异步更新等优化策略。

js实现vue双向绑定

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

相关文章

vue双向实现数据

vue双向实现数据

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

vue数据实现双向绑定

vue数据实现双向绑定

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

Vue数据绑定实现

Vue数据绑定实现

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

vue实现绑定页面

vue实现绑定页面

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

实现vue数据绑定

实现vue数据绑定

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

vue双向数据绑定实现

vue双向数据绑定实现

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