当前位置:首页 > VUE

vue双向绑定实现简单

2026-01-12 04:31:56VUE

Vue 双向绑定的简单实现

双向绑定的核心是通过数据劫持结合发布-订阅模式实现。以下是简化版的实现步骤:

数据劫持(Object.defineProperty)

通过 Object.defineProperty 劫持对象属性的 getset 方法,在数据变化时触发更新。

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();
    }
  });
}

依赖收集(Dep 类)

Dep 类用于管理订阅者(Watcher),并在数据变化时通知所有订阅者。

vue双向绑定实现简单

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

订阅者(Watcher 类)

Watcher 类负责更新视图,并在初始化时触发 get 以收集依赖。

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

简单示例

将上述部分组合成一个简单的双向绑定示例:

class SimpleVue {
  constructor(options) {
    this._data = options.data;
    this._el = document.querySelector(options.el);
    this._compile(this._el);
    this._observe(this._data);
  }
  _observe(data) {
    Object.keys(data).forEach(key => {
      defineReactive(data, key, data[key]);
    });
  }
  _compile(node) {
    if (node.nodeType === 1) {
      Array.from(node.attributes).forEach(attr => {
        if (attr.name === 'v-model') {
          const key = attr.value;
          node.addEventListener('input', e => {
            this._data[key] = e.target.value;
          });
          new Watcher(this, key, val => {
            node.value = val;
          });
        }
      });
    }
  }
}

使用示例

<input type="text" v-model="message">
<div id="display">{{ message }}</div>
<script>
  const vm = new SimpleVue({
    el: '#app',
    data: {
      message: 'Hello Vue!'
    }
  });
</script>

注意事项

  • 实际 Vue 的实现更复杂,包含虚拟 DOM、数组劫持、性能优化等。
  • Vue 3 改用 Proxy 替代 Object.defineProperty,解决无法监听数组变化等问题。
  • 完整实现还需处理模板编译、指令解析等逻辑。

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

相关文章

uniapp怎么给标签绑定颜色

uniapp怎么给标签绑定颜色

在 uniapp 中给标签绑定颜色 在 uniapp 中,可以通过动态绑定样式或类名的方式为标签设置颜色。以下是几种常见的方法: 动态绑定内联样式 使用 :style 绑定动态样式对象,直接在标签…

vue实现绑定页面

vue实现绑定页面

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

vue怎么实现双向

vue怎么实现双向

Vue 双向绑定的实现方式 Vue 中实现双向绑定的核心机制是 v-model 指令,它结合了属性绑定和事件监听,适用于表单元素或自定义组件。 表单元素的双向绑定 在原生表单元素(如 input、s…

vue双向数据绑定实现

vue双向数据绑定实现

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

vue 双向绑定 实现原理

vue 双向绑定 实现原理

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

vue怎样实现数组绑定

vue怎样实现数组绑定

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