news 2026/5/1 10:31:25

Vue 中的 keep-alive 组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 中的 keep-alive 组件

Vue 中的 keep-alive 组件

keep-alive是 Vue 内置的一个抽象组件,用于缓存不活动的组件实例,而不是销毁它们。这可以保留组件状态或避免重新渲染,从而提升性能。

核心特性

  1. 组件状态保持:当组件在<keep-alive>中切换时,其状态会被保留
  2. 避免重复渲染:缓存的组件不会重新创建,减少 DOM 操作
  3. 生命周期变化:添加了特殊的生命周期钩子

基本用法

<template> <div> <button @click="currentTab = 'TabA'">Tab A</button> <button @click="currentTab = 'TabB'">Tab B</button> <keep-alive> <component :is="currentTab"></component> </keep-alive> </div> </template> <script> export default { data() { return { currentTab: 'TabA' } }, components: { TabA: { template: '<div>Tab A Content <input placeholder="输入会被保留" /></div>' }, TabB: { template: '<div>Tab B Content</div>' } } } </script>

配置属性

1.include- 指定缓存组件
<!-- 字符串(逗号分隔) --> <keep-alive include="ComponentA,ComponentB"> <component :is="currentComponent"></component> </keep-alive> <!-- 正则表达式 --> <keep-alive :include="/ComponentA|ComponentB/"> <component :is="currentComponent"></component> </keep-alive> <!-- 数组 --> <keep-alive :include="['ComponentA', 'ComponentB']"> <component :is="currentComponent"></component> </keep-alive>
2.exclude- 排除不缓存组件
<keep-alive exclude="ComponentC"> <component :is="currentComponent"></component> </keep-alive>
3.max- 最大缓存实例数(Vue 2.5.0+)
<keep-alive :max="10"> <component :is="currentComponent"></component> </keep-alive>

生命周期钩子

<keep-alive>包裹的组件会获得两个额外的生命周期钩子:

activated
  • 组件被激活时调用
  • 当组件第一次渲染和每次从缓存中重新激活时都会触发
deactivated
  • 组件被停用时调用
  • 当组件被缓存时触发
<script> export default { name: 'MyComponent', activated() { console.log('组件被激活,恢复状态') // 例如:重新开始定时器 this.startTimer() }, deactivated() { console.log('组件被停用,进入缓存') // 例如:清除定时器 this.clearTimer() }, methods: { startTimer() { this.timer = setInterval(() => { console.log('定时器执行') }, 1000) }, clearTimer() { if (this.timer) { clearInterval(this.timer) } } }, // 传统生命周期依然有效 created() { console.log('created - 只在第一次创建时调用') }, mounted() { console.log('mounted - 只在第一次挂载时调用') } } </script>

与 Vue Router 结合使用

<template> <div id="app"> <!-- 缓存包含的路由组件 --> <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <!-- 不缓存的路由组件 --> <router-view v-if="!$route.meta.keepAlive"></router-view> </div> </template>
// router.jsconstroutes=[{path:'/home',component:Home,meta:{keepAlive:true// 需要缓存}},{path:'/detail/:id',component:Detail,meta:{keepAlive:false// 不需要缓存}}]

高级用法示例

动态决定是否缓存
<template> <keep-alive :include="cachedComponents"> <router-view></router-view> </keep-alive> </template> <script> export default { data() { return { cachedComponents: [] // 动态维护需要缓存的组件名 } }, watch: { '$route'(to, from) { // 根据路由规则动态添加/移除缓存 if (to.meta.keepAlive && !this.cachedComponents.includes(to.name)) { this.cachedComponents.push(to.name) } } } } </script>
配合 transition 使用
<transition name="fade" mode="out-in"> <keep-alive> <component :is="currentComponent"></component> </keep-alive> </transition>

实现原理

keep-alive内部维护一个缓存对象,主要流程:

  1. 首次渲染时,创建组件实例并缓存
  2. 组件切换时,将当前组件标记为deactivated并隐藏
  3. 再次切回时,从缓存中取出实例,标记为activated并显示
  4. 使用 LRU(最近最少使用)算法管理缓存(当使用max时)

注意事项

  1. 组件必须有 name 选项includeexclude属性通过组件名匹配
  2. 避免内存泄漏:合理设置max,及时清理不需要的缓存
  3. 状态一致性:确保activated中恢复的状态是正确的
  4. 异步组件:同样支持,但需要注意加载时机
  5. 与 v-for 使用:不推荐同时使用,可能会导致缓存混乱

适用场景

  1. 标签页切换:保持每个标签页的状态
  2. 表单页面:离开后返回,表单数据不丢失
  3. 列表页 → 详情页:返回列表页时保持滚动位置和过滤条件
  4. 需要大量计算或网络请求的组件:避免重复计算/请求

Vue 3 中的变化

在 Vue 3 中,keep-alive的使用方式类似,但有细微变化:

  • includeexclude支持组件实例的namesetup函数中的name
  • 不再支持缓存<keep-alive>的直接子元素数组
<!-- Vue 3 --> <router-view v-slot="{ Component }"> <keep-alive> <component :is="Component" v-if="$route.meta.keepAlive" /> </keep-alive> <component :is="Component" v-if="!$route.meta.keepAlive" /> </router-view>

keep-alive是 Vue 中优化组件性能的重要工具,合理使用可以显著提升用户体验,特别是在需要保持组件状态的场景中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 22:56:05

基于PLC的恒压供水控制系统(含配套报告)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于PLC的恒压供水控制系统(含配套报告)(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码西门子s7-1200变频恒压供水系统程序 带触摸屏恒压供水带定时轮询,可仿真pid控制调节恒压供水。本人原创根据pid原理编写&#xff0c;全网…

作者头像 李华
网站建设 2026/5/1 7:22:49

揭示AI专著生成密码!专业工具推荐,让学术写作轻松又快速

创新与学术专著写作困境 创新是学术专著的核心理念&#xff0c;也是写作过程中最大的挑战之一。一部优秀的学术专著绝不能仅仅是对已有成果的简单汇总&#xff0c;而是要时刻提出贯穿整体的原创性见解、理论结构或研究方法。在如此庞大的学术文献中&#xff0c;发掘尚未研究的…

作者头像 李华
网站建设 2026/5/1 3:49:07

知识竞赛抢答器PLC设计

第三章 硬件电路设计 3.1控制特点分析 知识竞赛抢答器通过PLC进行按控制要求编程&#xff0c;其主要的输入就是通过裁判员和参赛选手的按钮&#xff0c;然后将信号传递给信息分析中心&#xff08;PLC&#xff09;&#xff0c;PLC将根据信号作出相应的响应。知识竞赛抢答器有六个…

作者头像 李华
网站建设 2026/5/1 4:46:15

教育行业网页中,实现文件上传下载有哪些高效方案?

《一个.NET码农的奇幻漂流——20G文件上传历险记》 甲方需求说明书&#xff08;魔幻现实主义版&#xff09; “兄弟&#xff0c;我们要做个能在IE8上传20G文件的功能&#xff0c;要支持文件夹结构保留、断点续传、加密传输&#xff0c;预算是100块哈&#xff01;对了&#xf…

作者头像 李华
网站建设 2026/5/1 3:51:54

低功耗蓝牙技术入门指南(4)-- 等时适配层(The Isochronous Adaptation Layer)

9. 等时适配层 9.1 基础概念 等时适配层(ISOAL)的主要作用是解决一个潜在问题 —— 该问题可能影响涉及音频设备的连接式等时通信与广播式等时通信。该层也可应用于等时通信的其他场景。 9.1.1 音频采样基础 数字音频的工作原理是:对模拟音频信号进行采样,再通过编解码…

作者头像 李华