当前位置:首页 > 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实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通过…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue实现layout

vue实现layout

Vue 实现 Layout 布局的方法 在 Vue 中实现 Layout 布局通常涉及路由嵌套、组件化设计和动态渲染。以下是几种常见的实现方式: 使用嵌套路由 通过 Vue Router 的嵌套路由…

vue 水印 实现

vue 水印 实现

Vue 水印实现方法 使用 canvas 动态生成水印 在 Vue 组件中通过 canvas 绘制水印,并将其作为背景图片插入到目标元素中。这种方法灵活性高,支持动态调整水印内容、角度和透明度。 &…

用vue实现echarts

用vue实现echarts

使用 Vue 实现 ECharts 安装依赖 在 Vue 项目中安装 ECharts 和 Vue-ECharts(官方推荐的 Vue 封装库): npm install echarts vue-ec…

vue实现点击下载

vue实现点击下载

使用 <a> 标签实现下载 在 Vue 中可以通过动态生成 <a> 标签实现文件下载。适用于已知文件 URL 的场景。 <template> <butt…