当前位置:首页 > VUE

vue底层实现双向绑定

2026-02-24 01:48:21VUE

Vue 双向绑定的底层实现原理

Vue 的双向绑定核心是通过数据劫持结合发布-订阅模式实现的,主要依赖以下技术点:

  1. Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)
  2. 依赖收集与追踪
  3. 虚拟 DOM 差异更新

数据劫持的实现

在 Vue 2.x 中,通过 Object.defineProperty 劫持对象的属性访问和修改:

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

在 Vue 3.x 中改用 Proxy,直接代理整个对象:

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key); // 依赖收集
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key); // 触发更新
    }
  });
}

依赖收集与派发更新

  1. Watcher(观察者)
    每个组件实例对应一个 Watcher,在渲染过程中会触发数据的 getter,将 Watcher 添加到依赖列表中。

  2. Dep(依赖管理器)
    每个响应式属性都有一个 Dep 实例,用于存储所有依赖该属性的 Watcher。

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

虚拟 DOM 与更新优化

  1. 初次渲染
    通过 render 函数生成虚拟 DOM,再转为真实 DOM。

  2. 数据变更时
    触发 Watcher 的 update,重新生成虚拟 DOM,通过 diff 算法比对差异后局部更新。

// 简化的 diff 示例
function patch(oldVnode, newVnode) {
  if (oldVnode.tag !== newVnode.tag) {
    replaceNode(oldVnode, newVnode);
  } else {
    updateProps(oldVnode, newVnode);
    patchChildren(oldVnode, newVnode);
  }
}

双向绑定的完整流程

  1. 模板编译
    v-model 等指令被编译为 value 属性和 input 事件监听。

  2. 数据响应化
    初始化时对数据进行劫持,建立 Dep-Watcher 关联。

  3. 视图更新
    数据变化时通过虚拟 DOM 高效更新界面,用户输入通过事件触发数据修改。

与单向数据流的区别

虽然 Vue 通过 v-model 提供了双向绑定的语法糖,但底层仍是单向数据流:

vue底层实现双向绑定

  • 数据 -> 视图:通过响应式系统自动更新
  • 视图 -> 数据:需要显式的事件监听(如 @input

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

相关文章

vue 实现循环绑定

vue 实现循环绑定

Vue 实现循环绑定的方法 在 Vue 中,可以通过 v-for 指令实现循环绑定,用于渲染列表或对象数据。以下是几种常见的实现方式: 数组循环绑定 使用 v-for 遍历数组,可以通过索引或直接获…

vue数据绑定实现网页

vue数据绑定实现网页

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

vue如何实现数据绑定

vue如何实现数据绑定

Vue 数据绑定的实现方式 Vue 的数据绑定主要通过双向绑定(v-model)和单向绑定({{ }}插值或 v-bind)实现,核心基于响应式系统。以下是具体实现方法: 插值绑定(单向) 使用双大…

vue数据绑定实现表格

vue数据绑定实现表格

Vue 数据绑定实现表格的方法 基础表格绑定 使用 v-for 指令循环渲染表格行,绑定动态数据到表格单元格: <template> <table> <th…

react如何双向数据绑定

react如何双向数据绑定

双向数据绑定的实现方法 React 本身是单向数据流的设计理念,但可以通过以下方式实现类似双向数据绑定的效果: 受控组件方式 通过 value 和 onChange 事件实现双向绑定: funct…

react如何实现双向数据绑定

react如何实现双向数据绑定

实现双向数据绑定的方法 React 本身没有内置双向数据绑定的机制,但可以通过以下几种方式实现类似的功能。 使用受控组件 通过 value 和 onChange 属性将表单元素的状态与 React…