当前位置:首页 > VUE

vue keepalive 实现原理

2026-03-29 18:10:13VUE

Vue KeepAlive 实现原理

Vue 的 KeepAlive 是一个内置组件,用于缓存不活动的组件实例,避免重复渲染和销毁。其核心原理基于组件的生命周期钩子和虚拟 DOM 的缓存机制。

缓存机制

KeepAlive 通过维护一个缓存对象(cache)来存储被缓存的组件实例。当组件切换时,KeepAlive 会检查缓存中是否存在该组件的实例。如果存在,则直接复用;否则,创建新的实例并缓存。

缓存的键(key)默认由组件的 name 选项生成,如果没有 name,则根据组件的 tag 和上下文生成唯一标识。

vue keepalive 实现原理

生命周期钩子

KeepAlive 利用了 Vue 组件的生命周期钩子来实现激活和停用逻辑:

  • 被缓存的组件会触发 deactivated 钩子,而不是 destroyed
  • 当组件从缓存中重新激活时,会触发 activated 钩子。

虚拟 DOM 复用

KeepAlive 通过 vnode(虚拟节点)的缓存和复用机制,避免重复渲染。当组件被缓存时,其对应的 vnode 和 DOM 节点会被保留;重新激活时,直接复用缓存的 vnode,跳过渲染流程。

vue keepalive 实现原理

LRU 缓存策略

默认情况下,KeepAlive 使用 LRU(最近最少使用)策略管理缓存。通过 max 属性可以设置缓存的最大数量,超出时自动销毁最久未使用的实例。

实现示例

以下是简化版的 KeepAlive 核心逻辑:

const KeepAlive = {
  name: 'KeepAlive',
  abstract: true, // 抽象组件,不渲染真实 DOM
  props: {
    include: [String, RegExp, Array],
    exclude: [String, RegExp, Array],
    max: [Number, String]
  },
  created() {
    this.cache = Object.create(null) // 缓存对象
    this.keys = [] // 缓存键的 LRU 队列
  },
  render() {
    const slot = this.$slots.default
    const vnode = slot[0] // 获取子组件 vnode
    if (vnode) {
      const key = vnode.key == null
        ? vnode.componentOptions.Ctor.cid + (vnode.componentOptions.tag ? `::${vnode.componentOptions.tag}` : '')
        : vnode.key
      if (this.cache[key]) {
        vnode.componentInstance = this.cache[key].componentInstance // 复用实例
      } else {
        this.cache[key] = vnode // 缓存新实例
        this.keys.push(key)
        if (this.max && this.keys.length > parseInt(this.max)) {
          pruneCacheEntry(this.cache, this.keys[0], this.keys) // LRU 淘汰
        }
      }
      vnode.data.keepAlive = true // 标记为 keepAlive
    }
    return vnode
  }
}

关键点总结

  • abstract: true 标记为抽象组件,不参与真实 DOM 渲染。
  • 通过 vnodecomponentInstance 直接复用缓存的组件实例。
  • activateddeactivated 钩子由 KeepAlive 内部逻辑触发。
  • LRU 策略通过 keys 数组和 max 属性实现缓存淘汰。

标签: 原理vue
分享给朋友:

相关文章

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="clock-…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue实现快手

vue实现快手

Vue 实现类似快手的功能 Vue.js 是一个渐进式 JavaScript 框架,适合构建复杂的单页应用。要实现类似快手的功能,可以结合 Vue 和相关技术栈进行开发。 核心功能模块 视频流展示…

vue实现hexo

vue实现hexo

Vue 集成 Hexo 的实现方法 Hexo 是一个静态博客框架,而 Vue 是一个前端框架。将 Vue 集成到 Hexo 中可以通过以下方式实现: 在 Hexo 中使用 Vue 组件 通过 Hex…

vue  实现关联属性

vue 实现关联属性

Vue 实现关联属性 在 Vue 中实现关联属性通常涉及计算属性(computed properties)或侦听器(watchers),用于根据其他属性的变化动态更新目标属性。 使用计算属性 计算属…