news 2026/5/14 9:24:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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为缓存组件提供了精确的控制能力。合理使用这些钩子可以有效管理组件状态、优化性能,同时避免内存泄漏等问题。在实际开发中,结合路由配置和动态组件,可以创建出体验更流畅的单页应用。

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

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

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

作者头像 李华
网站建设 2026/5/14 8:03:24

‌2026热点:AI解决全球化测试本地化问题‌

全球化软件测试面临多语言适配、文化差异、数据隐私与效能瓶颈四大核心难题。多语言场景中&#xff0c;界面文本扩展&#xff08;如德语长词导致的布局错乱&#xff09;与混合语言输入&#xff08;如中英混杂查询&#xff09;的兼容性问题频发&#xff0c;传统人工测试难以覆盖…

作者头像 李华
网站建设 2026/5/13 11:15:09

‌测试AI的“意外”发现之旅:一场软件测试工程师的荒诞冒险

当AI决定“测试”测试者 在软件测试的世界里&#xff0c;我们总以为自己是掌控全局的“导演”&#xff0c;指挥着自动化脚本和测试用例上演一出出完美戏码。但2026年初&#xff0c;当“TestMaster AI”这个号称“革命性测试助手”的系统降临我们团队时&#xff0c;我这个资深测…

作者头像 李华
网站建设 2026/5/1 10:41:53

医院病历从WORD导入CKEDITOR为何出现乱码?

Word一键转存CMS升级大冒险 &#x1f4c5; 开发日志&#xff1a;2023年11月15日 大家好&#xff01;我是广西某高校软件工程专业的"码农小白"&#xff0c;正在为我的CMS新闻管理系统做一个超酷的升级——让Word内容能一键粘贴并自动上传图片&#xff01;下面记录我…

作者头像 李华
网站建设 2026/5/5 4:37:57

[特殊字符]收藏!2026年程序员必懂大模型:从入门到产业链全解析

2026年&#xff0c;大模型已从“落地潮”迈入“深度渗透期”&#xff0c;AI Agent自主进化、端云协同部署、多模态实时交互成为新一代技术风口。无论是基于Llama 4做行业精调落地、用LangChainRAG搭建企业级智能工作流&#xff0c;还是依托国产框架适配昇腾算力&#xff0c;掌握…

作者头像 李华