当前位置:首页 > VUE

vue双向绑定原理实现

2026-01-21 04:03:28VUE

Vue 双向绑定原理实现

Vue 的双向绑定核心是通过数据劫持结合发布-订阅模式实现的,主要依赖 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)来监听数据变化。

数据劫持

Vue 2.x 使用 Object.defineProperty 劫持对象的属性,通过 gettersetter 监听数据变化。

vue双向绑定原理实现

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}: ${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key}: ${newVal}`);
        val = newVal;
      }
    }
  });
}

const data = {};
defineReactive(data, 'message', 'Hello Vue');
data.message; // 读取 message: Hello Vue
data.message = 'Updated'; // 设置 message: Updated

Vue 3.x 使用 Proxy 代理整个对象,可以监听新增或删除的属性。

vue双向绑定原理实现

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log(`读取 ${key}: ${target[key]}`);
      return target[key];
    },
    set(target, key, value) {
      if (target[key] !== value) {
        console.log(`设置 ${key}: ${value}`);
        target[key] = value;
      }
      return true;
    }
  });
}

const data = reactive({ message: 'Hello Vue' });
data.message; // 读取 message: Hello Vue
data.message = 'Updated'; // 设置 message: Updated

依赖收集

Vue 通过依赖收集跟踪哪些数据属性被哪些组件或计算属性使用。当数据变化时,通知所有依赖进行更新。

class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (activeEffect) {
      this.subscribers.add(activeEffect);
    }
  }
  notify() {
    this.subscribers.forEach(effect => effect());
  }
}

let activeEffect = null;
function watchEffect(effect) {
  activeEffect = effect;
  effect();
  activeEffect = null;
}

const dep = new Dep();
watchEffect(() => {
  dep.depend();
  console.log('Effect run');
});
dep.notify(); // 输出 "Effect run"

实现双向绑定

结合数据劫持和依赖收集,可以实现简单的双向绑定。

<input id="input" type="text">
<div id="display"></div>

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

  watchEffect(() => {
    display.textContent = data.text;
  });

  input.addEventListener('input', (e) => {
    data.text = e.target.value;
  });
</script>

完整流程

  1. 初始化时通过 Object.definePropertyProxy 劫持数据。
  2. getter 中收集依赖(如模板中的 {{text}} 或计算属性)。
  3. setter 中触发依赖更新(如重新渲染组件或计算属性)。
  4. 通过 v-model 指令将表单输入与数据属性绑定,实现双向同步。

这种机制确保了数据变化时视图自动更新,视图输入变化时数据自动同步。

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

相关文章

vue双向实现数据

vue双向实现数据

Vue 双向数据绑定的实现 Vue 的双向数据绑定主要通过 v-model 指令实现,它结合了 v-bind 和 v-on 的功能,能够同步表单输入和应用状态。 基本语法 在表单元素上使用 v-mo…

vue怎么实现绑定

vue怎么实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现单向数据绑定(数据从模型到视图),语法为 v-bind:属性="数据" 或简写为 :属性="数据"。例如绑定 src 属性: <img :…

vue实现双向滚动

vue实现双向滚动

实现双向滚动的 Vue 方法 双向滚动通常指两个关联的滚动区域(如表格的头部和内容部分)同步滚动。以下是几种实现方式: 使用事件监听和 scroll 方法 通过监听一个滚动区域的 scroll 事件…

vue实现绑定页面

vue实现绑定页面

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

vue中实现双向绑定

vue中实现双向绑定

Vue 双向绑定的实现方式 Vue 中实现双向绑定主要通过 v-model 指令,它结合了属性绑定和事件监听,适用于表单元素和自定义组件。 表单元素的双向绑定 在表单元素(如 input、texta…

vue数据绑定实现网页

vue数据绑定实现网页

Vue 数据绑定实现网页 Vue.js 通过数据绑定机制实现动态网页,核心是利用响应式系统将数据与 DOM 关联。以下是关键实现方式: 双向数据绑定(v-model) 通过 v-model 指令实现…