news 2026/4/3 3:01:25

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/3/23 19:24:00

2013-2024年地级市环保部门政务微信数据

在数字化时代&#xff0c;社交媒体平台成为地方政府传播政策和与公众互动的重要渠道。中国各地级市环境局运用微信公众号发布推文&#xff0c;传递环保政策、宣传绿色生活理念、发布环保新闻及科普内容。这些推文不仅反映了地方政府在环境保护领域的重点关注方向&#xff0c;也…

作者头像 李华
网站建设 2026/3/31 2:26:15

亲测好用!8款AI论文写作软件测评,本科生毕业论文必备

亲测好用&#xff01;8款AI论文写作软件测评&#xff0c;本科生毕业论文必备 2026年AI论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳…

作者头像 李华
网站建设 2026/3/29 22:46:25

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

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

作者头像 李华
网站建设 2026/2/26 14:27:04

照明灯的控制方案基于PLC的校园照明控制系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫

照明灯的控制方案基于PLC的校园照明控制系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 照明灯的控制方案基于PLC的校园照明控制系统西门子s71 照明灯的控制方案 基于PLC的校园照明控制系统 西门子s71200制作 元器件选型 …

作者头像 李华
网站建设 2026/3/30 19:21:26

地震数据频率波数域变换与去噪的MATLAB实现

一、频率波数域&#xff08;F-K域&#xff09;变换原理与实现 频率波数域变换&#xff08;F-K变换&#xff09;是地震信号处理的核心技术&#xff0c;通过二维傅里叶变换将时-空域地震信号转换至频率-波数域&#xff0c;揭示信号传播特性。其数学表达式为&#xff1a; 其中&am…

作者头像 李华
网站建设 2026/3/27 14:38:14

收藏!程序员35+焦虑破局指南:深耕+跨界,大模型赛道新机遇

“35岁被优化”“简历投出石沉大海”&#xff0c;早已不是个别互联网程序员的困扰&#xff0c;而是蔓延在行业内的集体焦虑。但这绝非意味着程序员到了中年就能力衰退、价值缩水&#xff0c;核心根源实则是行业生态的双重挤压&#xff1a;一方面&#xff0c;国内互联网行业迭代…

作者头像 李华