当前位置:首页 > VUE

vue keep alive实现

2026-01-15 23:34:04VUE

vue keep-alive 的实现方式

在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染。以下是其核心实现方法:

基本用法

<keep-alive>
  <component :is="currentComponent"></component>
</keep-alive>

keep-alive 会缓存包裹的组件实例,当切换组件时,不会触发组件的销毁和重新创建。

包含与排除特定组件

通过 includeexclude 属性可以指定需要缓存或排除缓存的组件:

<keep-alive :include="['ComponentA', 'ComponentB']" :exclude="['ComponentC']">
  <component :is="currentComponent"></component>
</keep-alive>
  • include:只有名称匹配的组件会被缓存(支持字符串、正则或数组)。
  • exclude:名称匹配的组件不会被缓存。

最大缓存实例数

通过 max 属性可以限制缓存的组件实例数量,超出时会销毁最久未访问的实例:

vue keep alive实现

<keep-alive :max="5">
  <component :is="currentComponent"></component>
</keep-alive>

生命周期钩子

被缓存的组件会触发特定的生命周期钩子:

  • activated:组件被激活时调用(从缓存中恢复)。
  • deactivated:组件被停用时调用(进入缓存)。
export default {
  activated() {
    console.log('组件被激活');
  },
  deactivated() {
    console.log('组件被停用');
  }
};

自定义 key 控制缓存

默认情况下,keep-alive 根据组件的 name 选项进行缓存。可以通过 key 属性自定义缓存标识:

<keep-alive>
  <router-view :key="$route.fullPath"></router-view>
</keep-alive>

与 Vue Router 结合使用

keep-alive 常用于缓存路由组件:

vue keep alive实现

<keep-alive>
  <router-view></router-view>
</keep-alive>

通过路由的 meta 字段可以更灵活地控制缓存:

{
  path: '/foo',
  component: Foo,
  meta: { keepAlive: true }
}
<keep-alive>
  <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

实现原理

keep-alive 的核心原理是通过 Vue 的虚拟 DOM 缓存机制:

  1. 在渲染阶段,keep-alive 会检查缓存中是否存在目标组件。
  2. 如果存在,直接返回缓存的实例;否则创建新实例并缓存。
  3. 使用 LRU(最近最少使用)算法管理缓存数量(当 max 被设置时)。

其内部通过 cache 对象存储组件实例,并通过 keys 数组记录访问顺序:

const cache = Object.create(null);
const keys = [];

当组件切换时,keep-alive 会调用 pruneCacheEntry 方法清理超出缓存的实例。

标签: vuekeep
分享给朋友:

相关文章

vue实现多级弹窗

vue实现多级弹窗

Vue 多级弹窗实现方法 方法一:使用动态组件与递归组件 在 Vue 中可以通过动态组件配合递归组件实现多级弹窗。定义一个基础弹窗组件,通过递归调用自身实现层级嵌套。 基础弹窗组件模板示例:…

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

vue实现按钮刷新

vue实现按钮刷新

Vue 实现按钮刷新功能 在 Vue 中实现按钮刷新功能可以通过多种方式实现,具体取决于刷新需求是局部刷新还是全局刷新。以下是几种常见的方法: 使用 window.location.reload()…

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue实现多层评论回复

vue实现多层评论回复

Vue 实现多层评论回复 数据结构设计 多层评论通常采用嵌套结构,每个评论对象包含子评论数组。示例数据结构如下: comments: [ { id: 1, content: '父…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…