当前位置:首页 > VUE

vue keepalive 实现原理

2026-01-17 01:31:55VUE

Vue KeepAlive 实现原理

Vue 的 KeepAlive 是一个内置组件,用于缓存不活动的组件实例,避免重复渲染,提升性能。以下是其核心实现原理:

缓存机制

KeepAlive 通过维护一个缓存对象(cache)存储组件实例。当组件被切换时,KeepAlive 会将不活动的组件实例存入缓存,而非销毁。再次激活时,直接从缓存中恢复实例。

缓存对象的结构为键值对,键是组件的唯一标识(默认基于组件名或匿名组件的 tag),值是组件的 VNode 和实例。

vue keepalive 实现原理

LRU 算法

KeepAlive 默认采用 LRU(最近最少使用)算法管理缓存。当缓存数量超过 max 属性设定的上限时,最久未被访问的实例会被销毁。LRU 通过维护一个访问顺序的链表实现。

生命周期钩子

KeepAlive 包裹的组件会触发特定的生命周期钩子:

vue keepalive 实现原理

  • activated:组件从缓存恢复并插入 DOM 时触发。
  • deactivated:组件被缓存并从 DOM 移除时触发。

VNode 处理

KeepAlive 在渲染阶段通过 render 函数处理子组件:

  1. 根据 includeexclude 属性匹配需要缓存的组件。
  2. 命中缓存时返回缓存的 VNode,否则渲染新实例并缓存。

源码关键逻辑

以下是简化后的核心逻辑(基于 Vue 3 源码):

const KeepAliveImpl = {
  __isKeepAlive: true,
  setup(props, { slots }) {
    const cache = new Map();
    const keys = new Set(); // LRU 顺序维护

    return () => {
      const children = slots.default();
      const rawVNode = children[0];

      // 检查是否可缓存
      if (!isVNode(rawVNode) || !shouldKeepAlive(rawVNode, props)) {
        return rawVNode;
      }

      const key = rawVNode.key;
      const cachedVNode = cache.get(key);

      if (cachedVNode) {
        // 命中缓存,更新 LRU 顺序
        keys.delete(key);
        keys.add(key);
        return cachedVNode;
      } else {
        // 未命中,缓存新实例
        cache.set(key, rawVNode);
        keys.add(key);
        // 超出上限时淘汰最旧缓存
        if (props.max && keys.size > props.max) {
          const oldestKey = keys.values().next().value;
          cache.delete(oldestKey);
          keys.delete(oldestKey);
        }
        return rawVNode;
      }
    };
  }
};

使用示例

<template>
  <KeepAlive :max="3" include="ComponentA,ComponentB">
    <component :is="currentComponent" />
  </KeepAlive>
</template>

注意事项

  • 动态组件需设置 key 以保证缓存正确性。
  • 频繁更新的组件可能因缓存占用内存,需合理设置 max
  • includeexclude 支持字符串、正则或数组格式。

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

相关文章

vue实现拼音搜索

vue实现拼音搜索

实现拼音搜索的基本思路 拼音搜索的核心是将中文转换为拼音,并在用户输入拼音时匹配对应的中文内容。Vue中可以通过集成拼音转换库(如pinyin或pinyin-pro)实现这一功能。 安装拼音转换库…

vue的动画实现

vue的动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要通过内置组件和第三方库支持。 使用 Vue 内置过渡组件 Vue 的 transition 和 transition-group 组件可…

vue核心实现原理详解

vue核心实现原理详解

Vue核心实现原理 Vue.js的核心实现原理主要包括响应式系统、虚拟DOM、模板编译和组件化机制。以下是对这些核心原理的详细解析: 响应式系统 Vue的响应式系统基于Object.definePr…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:用…

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…