当前位置:首页 > VUE

js实现vue双向绑定

2026-02-25 04:14:44VUE

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

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

数据劫持(响应式原理)

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

js实现vue双向绑定

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 负责更新视图:

js实现vue双向绑定

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

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

相关文章

vue实现绑定herf

vue实现绑定herf

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

vue实现数据绑定

vue实现数据绑定

Vue 数据绑定的实现方式 Vue.js 提供了多种数据绑定方式,主要包括双向绑定 (v-model)、单向绑定 ({{ }} 插值或 v-bind)、以及响应式数据管理。以下是具体实现方法: 双向…

vue实现数组绑定

vue实现数组绑定

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

vue实现双休绑定

vue实现双休绑定

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

vue实现数据双向

vue实现数据双向

在Vue中实现数据双向绑定主要依靠v-model指令,它结合了属性绑定和事件监听,适用于表单元素或自定义组件。以下是具体实现方式: 基础表单元素的双向绑定 对于原生表单元素(如input、texta…

vue实现绑定页面

vue实现绑定页面

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