当前位置:首页 > 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 实现响应式底层

// 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 实现响应式底层

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 实现延迟执行。

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

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

相关文章

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from '…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

vue键盘实现

vue键盘实现

监听键盘事件 在Vue中监听键盘事件可以通过v-on指令或@缩写实现。常见的键盘事件包括keydown、keyup和keypress。例如监听回车键事件: <template> &l…

vue实现 页面

vue实现 页面

Vue 实现页面的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 是官方脚手架工具,适合传统项目;Vite 提供更快的现代构建体验。 npm cre…