VUE中,keep-alive组件与钩子函数的生命周期

一、没有keep-alive组件

如果没有keep-alive组件,Vue 组件的切换遵循标准的"销毁旧组件 -> 创建新组件"流程。

这意味着:每次切换,旧组件都会彻底死亡(销毁),新组件都会重新出生(初始化)。

1. 核心结论

activated 和 deactivated:永远不会触发。这两个钩子完全依赖于 的存在。

created 和 mounted:每次进入都会触发。因为组件是全新创建的。

beforeDestroy 和 destroyed:每次离开都会触发。因为组件被彻底销毁了。

2. 详细执行流程演示

假设我们从 页面 A 切换到 页面B,然后再切回 页面 A。

  • 第一步:首次进入 页面 A
    • 组件实例被创建并挂载。
    • beforeCreate
    • created ✅ (初始化数据)
    • beforeMount
    • mounted ✅ (DOM 就绪,启动定时器/请求)
  • 第二步:从 页面 A 切换到 页面 B
    • 页面 A 被销毁,页面 B 被创建。
    • 🔴 页面 A (离开时):
    • beforeRouteLeave (路由守卫,如果有)
    • beforeDestroy ✅ (清理工作开始)
    • destroyed ✅ (实例彻底消失,数据丢失,定时器若未清除则泄漏)
    • 注意:这里不会触发 deactivated
    • 🟢 页面 B (进入时):
    • beforeCreate
    • created ✅ (重新初始化)
    • beforeMount
    • mounted ✅ (重新发起请求,重新绑定事件)
    • 注意:这里不会触发 activated
  • 第三步:从 页面 B 切回 页面 A
    • 页面 B 被销毁,页面 A 重新创建(是一个全新的实例,不是之前的那个)。
    • 🔴 页面 B (离开时):
    • beforeDestroy
    • destroyed
    • 🟢 页面 A (再次进入时):
    • beforeCreate
    • created ✅ (再次执行!)
    • beforeMount
    • mounted ✅ (再次执行!)
    • 结果:页面状态重置,之前输入的内容、滚动条位置、临时变量全部丢失。

二、有keep-alive组件

只要组件被 缓存,activated 钩子会在每次该组件从"隐藏状态"变为"显示状态"时执行。

这与 created 和 mounted 形成鲜明对比:

created / mounted:只在组件第一次初始化时执行一次。

activated:在组件每一次被激活(切回来)时都会执行。

1. 执行流程演示

假设你有一个列表页(List)和一个详情页(Detail),详情页被 缓存。

  • 首次进入详情页:
    • 触发:created → mounted → activated
    • 状态:组件实例创建,DOM 挂载,变为活跃。
  • 返回列表页(详情页被隐藏):
    • 触发:deactivated
    • 状态:组件实例保留在内存中,DOM 移除,变为非活跃。
  • 再次进入详情页(从缓存恢复):
    • 触发:activated ✅ (再次执行!)
    • 不会触发:created, mounted ❌
    • 状态:组件实例直接从内存唤醒,DOM 重新插入。
  • 第三次进入详情页:
    • 触发:activated ✅ (又执行了一次!)

三、总结

动作 没有 <keep-alive> (标准模式) <keep-alive> (缓存模式)
首次进入 createdmounted createdmountedactivated
切换离开 beforeDestroydestroyed (组件死亡) deactivated (组件休眠)
再次进入 createdmounted (重生,状态重置) activated (唤醒,状态保留)
再次离开 beforeDestroydestroyed deactivated
最终销毁 (已在第一次离开时销毁) beforeDestroydestroyed (当 keep-alive 移除或 exclude 时)
activated ❌ 从不触发 ✅ 每次激活都触发
deactivated ❌ 从不触发 ✅ 每次隐藏都触发
相关推荐
发现一只大呆瓜3 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
霍理迪4 小时前
Vue的响应式和生命周期
前端·javascript·vue.js
李剑一4 小时前
别再瞎写了!Cesium 模型 360° 环绕,4 套源码全公开,项目直接用
前端
小码哥_常4 小时前
Android消息机制:Handler、Looper和Message的深度剖析
前端
小码哥_常4 小时前
安卓开发新姿势:文件Picker全攻略,无痛适配不再难
前端
happymaker06264 小时前
web前端学习日记——DAY04
前端·学习
发现一只大呆瓜4 小时前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
swipe5 小时前
为什么 RAG 一定离不开向量检索:从文档向量化到语义搜索的工程实现
前端·llm·agent
OpenTiny社区6 小时前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp