当前位置:首页 > VUE

vue 实现响应式底层

2026-02-23 08:16:04VUE

Vue 响应式原理的核心机制

Vue 的响应式系统基于 ES5 的 Object.defineProperty(Vue 2)或 ES6 的 Proxy(Vue 3)实现。以下是核心实现逻辑:

数据劫持 通过拦截对象属性的读取和修改操作,在 getter 中收集依赖,在 setter 中触发更新。对于数组,Vue 重写了数组的变异方法(如 push/pop/splice)。

// Vue 2 的简化实现
function defineReactive(obj, key) {
  const dep = new Dep()
  let val = obj[key]
  Object.defineProperty(obj, key, {
    get() {
      dep.depend() // 收集当前正在计算的 Watcher
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      dep.notify() // 通知所有订阅者更新
    }
  })
}

依赖收集 每个响应式属性关联一个 Dep 实例,用于管理所有订阅该属性的 Watcher。当属性被访问时,当前执行的 Watcher 会被添加到依赖列表中。

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

派发更新 当数据变化时,通过 Dep 通知所有 Watcher 执行更新。组件级的 Watcher 会触发重新渲染,计算属性的 Watcher 会重新计算值。

Vue 3 的 Proxy 改进

Vue 3 使用 Proxy 替代 Object.defineProperty,解决了以下问题:

  • 可检测新增/删除的属性
  • 更好的数组变化检测
  • 减少递归遍历的性能消耗
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key)
      return Reflect.get(target, key)
    },
    set(target, key, value) {
      Reflect.set(target, key, value)
      trigger(target, key)
    }
  })
}

异步更新队列

Vue 通过异步队列优化多次数据变更的更新效率。同一事件循环内的所有数据变更会合并为一次更新,使用 nextTick 实现延迟执行。

vue 实现响应式底层

queueWatcher(watcher) {
  if (!flushing) {
    queue.push(watcher)
  }
  nextTick(flushSchedulerQueue)
}

标签: 底层vue
分享给朋友:

相关文章

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue 简单实现

vue 简单实现

以下是 Vue 的简单实现示例,涵盖基础模板、数据绑定、方法及生命周期: 基础模板与数据绑定 <div id="app"> <p>{{ message }}</p&…