news 2026/6/10 18:37:47

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/6/9 22:27:38

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

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

作者头像 李华
网站建设 2026/6/10 15:23:03

AI与传统测试融合:最佳实践模式

融合背景与行业痛点 传统软件测试长期面临效率低下、覆盖不全和维护成本高的挑战。测试人员常陷入重复劳动&#xff08;如手动编写相似功能用例&#xff09;&#xff0c;导致测试周期长、缺陷遗漏率高&#xff0c;尤其在金融等高监管领域&#xff0c;人工方法难以实现“零缺陷…

作者头像 李华
网站建设 2026/6/1 2:37:05

java作用域对代码的可维护性和可读性有什么影响?

作用域对代码可维护性 & 可读性的核心影响作用域本质是给程序元素&#xff08;变量、方法等&#xff09;划定 “访问边界”&#xff0c;这个边界的合理性直接决定代码是否容易理解、修改和排查问题&#xff0c;具体影响体现在以下方面&#xff1a;1. 作用域越小&#xff0c…

作者头像 李华