当前位置:首页 > VUE

vue双向绑定实现简单

2026-03-06 17:21:27VUE

Vue 双向绑定的实现原理

Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合了数据劫持(Object.definePropertyProxy)和发布-订阅模式。以下是简化版的实现逻辑:

数据劫持

通过 Object.defineProperty 监听对象属性的变化:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      // 触发更新
      dep.notify();
    }
  });
}

依赖收集(Dep 类)

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

观察者(Watcher 类)

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

简单实现示例

以下是一个极简的双向绑定 Demo:

<input id="input" type="text">
<p id="text"></p>

<script>
  const data = { value: '' };
  const input = document.getElementById('input');
  const text = document.getElementById('text');

  // 数据劫持
  Object.defineProperty(data, 'value', {
    get() {
      return this._value;
    },
    set(newVal) {
      this._value = newVal;
      text.innerText = newVal; // 更新视图
    }
  });

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

  // 初始化
  data.value = 'Hello Vue';
  input.value = data.value;
</script>

现代实现(Proxy 替代)

Vue 3 使用 Proxy 实现更高效的数据监听:

vue双向绑定实现简单

const data = new Proxy({ value: '' }, {
  set(target, key, value) {
    target[key] = value;
    text.innerText = value;
    return true;
  }
});

关键点

  • 数据驱动视图:通过数据变化自动更新 DOM。
  • 视图影响数据:通过事件监听(如 input)修改数据。
  • 性能优化:Vue 实际实现中会使用虚拟 DOM 和异步更新策略。

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

相关文章

uniapp怎么给标签绑定颜色

uniapp怎么给标签绑定颜色

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

vue实现数据绑定

vue实现数据绑定

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

vue如何实现绑定

vue如何实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现动态绑定 HTML 属性或组件 prop。基本语法为 v-bind:属性名="表达式",简写为 :属性名="表达式"。例如绑定 class 或 sty…

vue实现数组双向绑定

vue实现数组双向绑定

实现数组双向绑定的方法 在Vue中,实现数组的双向绑定通常需要结合v-model指令或自定义事件处理。以下是几种常见的方法: 使用v-model绑定数组 Vue的v-model指令默认支持表单元素的…

vue简单实现双向绑定

vue简单实现双向绑定

Vue 双向绑定的简单实现 Vue 的双向绑定核心是通过 v-model 指令实现的,它结合了 v-bind 和 v-on 的功能。以下是一个简单的实现方式: 模板部分 <template&…

vue绑定图片实现默认

vue绑定图片实现默认

vue绑定图片实现默认的方法 在Vue中绑定图片并设置默认图片,可以通过多种方式实现。以下是几种常见的方法: 使用v-bind绑定图片路径 在模板中使用v-bind指令绑定图片路径,同时设置默认图…