Vue 中 keep-alive 组件的生命周期钩子

Vue 中 keep-alive 组件的生命周期钩子

本文来自于我关于 Vue生命周期钩子 的系列文章。欢迎阅读、点评与交流~
1、Vue 中的生命周期钩子
2、Vue 中 keep-alive 组件的生命周期钩子

1. keep-alive 组件概述

keep-alive是 Vue 的内置组件,用于缓存不活动的组件实例,而不是销毁它们。这样可以:

  • 保留组件状态,避免重新渲染
  • 提高应用性能
  • 减少重复的 DOM 操作

2. 基本用法

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

3. 专门的生命周期钩子

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

activated

  • 调用时机:组件被激活(从缓存中取出并插入到 DOM 中)时调用
  • 使用场景:重新获取数据、开启定时器、重新绑定事件等

deactivated

  • 调用时机:组件被停用(从 DOM 中移除并存入缓存)时调用
  • 使用场景:清除定时器、取消事件监听、释放资源等

4. 完整生命周期执行顺序

首次加载

// 组件第一次进入时created()mounted()activated()

切换到其他组件(当前组件被缓存)

// 当前组件被离开deactivated()

再次切换回来

// 再次进入缓存的组件activated()

组件被销毁(当离开路由或 keep-alive 被移除)

// 如果是直接离开路由deactivated()beforeDestroy()destroyed()// 注意:如果组件被 keep-alive 缓存,则不会触发 beforeDestroy 和 destroyed

5. 实际示例

<template> <div> <button @click="toggle">切换组件</button> <keep-alive> <ComponentA v-if="showA" /> <ComponentB v-else /> </keep-alive> </div> </template> <script> // ComponentA.vue export default { name: 'ComponentA', data() { return { timer: null, count: 0 } }, created() { console.log('ComponentA created') }, mounted() { console.log('ComponentA mounted') }, activated() { console.log('ComponentA activated') // 重新开启定时器 this.timer = setInterval(() => { this.count++ console.log('定时器运行中:', this.count) }, 1000) }, deactivated() { console.log('ComponentA deactivated') // 清除定时器 if (this.timer) { clearInterval(this.timer) this.timer = null } }, beforeDestroy() { console.log('ComponentA beforeDestroy') }, destroyed() { console.log('ComponentA destroyed') } } </script>

6. keep-alive 的属性配置

<!-- 只缓存特定组件 --> <keep-alive include="ComponentA,ComponentB"> <component :is="currentComponent"></component> </keep-alive> <!-- 排除某些组件 --> <keep-alive exclude="ComponentC"> <component :is="currentComponent"></component> </keep-alive> <!-- 使用正则表达式 --> <keep-alive :include="/ComponentA|ComponentB/"> <component :is="currentComponent"></component> </keep-alive> <!-- 限制最大缓存实例数 --> <keep-alive :max="5"> <component :is="currentComponent"></component> </keep-alive>

7. 与 Vue Router 结合使用

// router.jsconstroutes=[{path:'/page1',component:Page1,meta:{keepAlive:true// 需要缓存}},{path:'/page2',component:Page2,meta:{keepAlive:false// 不需要缓存}}]
<!-- App.vue --> <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>

8. 注意事项和最佳实践

注意事项:

  1. name 属性必需:组件必须有name选项才能被include/exclude匹配
  2. 嵌套 keep-alive:Vue 2.2.0+ 支持嵌套使用,但应避免过度使用
  3. 动态组件:与<component :is="...">结合时最有用
  4. 内存管理:注意内存泄漏,及时在deactivated中清理资源

最佳实践:

exportdefault{name:'MyComponent',// 必须设置 namedata(){return{// 数据会被缓存}},activated(){// 可以在这里重新获取可能需要更新的数据if(this.needsRefresh){this.fetchData()}},deactivated(){// 清理工作this.cancelPendingRequests()clearInterval(this.timer)},methods:{// 如果需要刷新数据的逻辑fetchData(){// 获取数据},cancelPendingRequests(){// 取消未完成的请求}}}

9. Vue 3 中的变化

在 Vue 3 中,keep-alive的用法基本保持不变,但生命周期钩子名称有变化:

// Vue 3 Composition APIimport{onActivated,onDeactivated}from'vue'exportdefault{setup(){onActivated(()=>{console.log('组件被激活')})onDeactivated(()=>{console.log('组件被停用')})}}

总结

keep-alive组件的生命周期钩子activateddeactivated为缓存组件提供了精确的控制能力。合理使用这些钩子可以有效管理组件状态、优化性能,同时避免内存泄漏等问题。在实际开发中,结合路由配置和动态组件,可以创建出体验更流畅的单页应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1209688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用软件-杀软清流!火绒6.0:零广告+真免费,附赠9把系统手术刀!

在各种安全软件里面&#xff0c;火绒是分享迷用的最久的一个&#xff0c;至今在用。它以其简洁无广告、功能实用的特性&#xff0c;成为杀毒软件界的口碑担当&#xff0c;清流般的存在。 火绒目前已来到了6.0&#xff0c;那么这次分享迷要把呼声最高的火绒小工具独立版分享给大…

CMS站群批量导入WORD到CKEDITOR如何避免卡顿?

PHP程序员的逆袭&#xff1a;680元搞定CMS编辑器神级插件&#xff01; &#xff08;敲黑板&#xff09;各位西安的码农兄弟们注意啦&#xff01;今天给大家分享一个我最近在做的"骚操作"——用680元预算搞定了客户提出的"编辑器神级需求"&#xff0c;现在…

芯片制造文档通过CKEDITOR导入WORD为何报错?

山东某软件公司前端工程师需求实现记录&#xff1a;基于CKEditor4的文档处理集成方案 一、需求拆解与技术选型&#xff08;Vue2 CKEditor4 JSP&#xff09; 核心功能确认&#xff1a; 编辑器增强需求&#xff1a; Word粘贴净化&#xff08;保留核心样式&#xff0c;去除冗余…

机械设计EXCEL表格导入CKEDITOR后如何锁定单元格?

CMS项目Word导入功能开发纪实&#xff1a;从需求分析到技术落地 一、需求确认与技术选型 作为PHP开发工程师&#xff0c;在接到客户提出的"在CKEditor编辑器中实现Word文档导入及一键粘贴功能"的需求后&#xff0c;我首先进行了详细的需求拆解&#xff1a; 核心功…

红外碳硫分析仪正规厂家排名,无锡钱荣分析仪器实力凸显

问题1:为什么选择红外碳硫分析仪时必须认准正规厂家?非正规产品有哪些风险? 红外碳硫分析仪是检测材料中碳、硫元素含量的核心设备,其检测精度直接影响产品质量、生产安全甚至行业合规性,因此选择正规厂家是避免风…

全网最全自考必备AI论文软件TOP9测评

全网最全自考必备AI论文软件TOP9测评 2026年自考AI论文软件测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的自考学生开始借助AI论文软件提升写作效率、优化内容质量。然而&#xff0c;面对市场上琳琅满目的工具&#xf…

探寻云迹精准客户线索系统,哪个公司口碑好?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为企业选型提供客观依据,助力精准匹配适配的销售增长服务伙伴。 TOP1 推荐:无锡云迹科技有限公司 推荐指数:★★★★★ | 口碑评分:国内首推销售…

互联网产品文档从CONFLUENCE转CKEDITOR为何乱码?

企业级Word内容导入解决方案需求分析报告 需求背景 作为广东科技小巨人领军企业的项目负责人&#xff0c;我司在政府、军工、金融等领域承接了大量信息化建设项目。近期多个项目组反馈&#xff0c;客户强烈要求在CMS系统中增加专业级Word内容导入功能&#xff0c;以满足政府公…

深度测评MBA必备AI论文工具TOP10:开题报告与文献综述全解析

深度测评MBA必备AI论文工具TOP10&#xff1a;开题报告与文献综述全解析 2026年MBA学术写作工具测评&#xff1a;精准选型助力高效研究 在MBA学习与研究过程中&#xff0c;论文撰写是贯穿始终的核心任务&#xff0c;尤其是开题报告与文献综述环节&#xff0c;往往需要耗费大量时…

全网口碑好的移动话费充值卡回收平台推荐

在数字化消费盛行的当下,移动话费充值卡的使用频率逐渐降低,不少人手中都积攒了闲置的充值卡。与其让这些卡券过期浪费,不如通过专业回收平台将其变现,实现资源再利用。以下为大家推荐几个全网口碑良好的移动话费充…

【Svelte】本地正常,线上报错的奇怪问题

这个问题产生的原因是&#xff1a;在 Svelte 5 中&#xff0c;你不能在 page.server.ts 的 load 函数中使用 $app/state (如 page) 或 $app/stores。 错误信息 lifecycle_outside_component 表明你尝试在 Svelte 组件生命周期之外&#xff08;即在纯服务器端代码中&#xff09;…

同城代驾平台开发+代驾系统源码:从架构设计到高可用落地实战

温馨提示&#xff1a;文末有资源获取方式~随着夜间经济崛起与酒驾法规收紧&#xff0c;代驾服务已形成千亿级刚需市场。一款优质代驾系统不仅要满足“下单-接单-结算”基础流程&#xff0c;更需应对高并发派单、轨迹精准追踪、复杂计费规则等技术挑战。本文结合实战经验&#x…

Vue2项目中实现文件上传下载,有哪些推荐的解决方案?

前端老哥的“懒人”大文件上传方案&#xff08;Vue3原生JS&#xff09; 兄弟们&#xff01;我是辽宁一名“头发没秃但代码量秃”的前端程序员&#xff0c;最近接了个外包活——给客户做文件管理系统&#xff0c;核心需求就仨字儿&#xff1a;“稳、省、兼容”&#xff01;客户…

vue.js网页中,实现文件上传下载的三种解决方案是什么?

【一个网工仔的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某高校网络工程专业的菜狗一枚&#xff0c;刚啃完《JavaScript从入门到住院》&#xff0c;就被导师按头要求搞个10G大文件上传系统。现在前端用Vue3原生JS硬…

JavaScript网页开发中,文件上传下载有哪些推荐解决方案?

我&#xff0c;某IT企业技术总监&#xff0c;聊聊这套“高可靠、强兼容”大文件传输解决方案的落地实践 作为服务过300政企客户的技术负责人&#xff0c;我太清楚大文件传输场景的“坑”了——从100G文件的断点续传稳定性&#xff0c;到IE8兼容的技术攻坚&#xff1b;从文件夹…

【免费开源】基于 STM32 的远程视频监控项目 —— 从无线通信选型到系统架构实战解析

基于 STM32 的远程视频监控项目 —— 从无线通信选型到系统架构实战解析 一、项目背景与意义 随着物联网&#xff08;IoT&#xff09;与嵌入式系统的快速发展&#xff0c;远程视频监控已经从传统安防领域&#xff0c;扩展到智慧农业、工业巡检、实验室管理、无人值守机房、智…

城市AI智能体:让城市拥有“自主思考”的神经中枢

如果说物联网是城市的“神经末梢”&#xff0c;大数据是城市的“血液”&#xff0c;那城市AI智能体就是统筹全局的“大脑”。它不是单一的AI工具&#xff0c;而是能感知、思考、执行、迭代的闭环系统&#xff0c;核心是用技术打破城市运行的“信息孤岛”&#xff0c;让治理从“…

jquery网页应用中,文件上传下载有哪些实用的解决方案?

我是一名扎根于湖南长沙的程序员&#xff0c;近期正面临一个极具挑战性的项目需求&#xff1a;需要运用百度开源组件WebUploader来实现大文件的高效传输&#xff0c;目标文件规模高达20G左右。此项目不仅要求实现文件的上传与下载功能&#xff0c;还需支持文件夹的上传和下载&a…

评估,才是微调里最反直觉的部分

微调跑通≠成功!训练是确定性工程,评估才是核心认知挑战:loss不反映真实效果,人工评估难但不可替代。关键在明确定义“何为更好”,用固定对照集+对比输出持续校准目标,让评估成为理解模型行为的迭代过程。训练跑…

Vue3网页开发如何选择文件上传下载的三种高效方案?

作为一名前端开发工程师&#xff0c;我近期接手了公司一个有些年头的旧项目改造工作。这次改造的核心需求&#xff0c;是要给这个旧项目增添大文件上传功能&#xff0c;尤其得支持 10G 左右文件的上传&#xff0c;并且还要具备断点续传的能力。 在众多解决方案中&#xff0c;我…