当前位置:首页 > 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实现按钮组轮换

vue实现按钮组轮换

实现按钮组轮换的方法 在Vue中实现按钮组轮换效果可以通过动态绑定类和事件处理来完成。以下是一种常见的实现方式: 模板部分 <template> <div class="bu…

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert 生成…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null } }…

vue diff实现

vue diff实现

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

vue实现tree

vue实现tree

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