keep-alive 下组件生命周期围绕缓存复用重构:首次进入执行 mounted 和 activated;切换离开仅触发 deactivated,不执行 unmounted;再次进入只触发 activated;最终销毁时才执行 beforeunmount 和 unmounted。

在 keep-alive 状态下,组件的生命周期不再遵循“每次切换都重建”的模式,而是围绕“缓存复用”重新组织。关键不是 DOM 是否存在,而是组件实例是否被保留在内存中——DOM 可能被移出视图,但组件实例没销毁,因此常规钩子触发次数大幅减少,而新增的 activated 和 deactivated 成为真正反映“可见性变化”的核心逻辑入口。
首次进入:mounted 和 activated 都会执行
这是唯一一次两个钩子共存的场景。组件完成初始化流程(beforeCreate → created → beforeMount → mounted)后,紧接着触发 activated。此时可理解为:组件已挂载完毕,且正式“激活上线”。
适合把一次性初始化操作(如全局事件绑定、初始数据拉取)放在 mounted;把与“显示态”强相关的动作(如启动轮询、恢复滚动位置、聚焦输入框)放在 activated。
切换离开:不走 unmounted,只触发 deactivated
组件从视图中暂时移除,但实例仍驻留在 keep-alive 的 cache 对象里。这时:
• beforeUnmount 和 unmounted 完全不会执行
• deactivated 会被调用,是清理副作用的黄金时机
- 清除定时器(避免后台持续运行)
- 取消尚未完成的 API 请求(配合 AbortController)
- 解绑
window或document上的事件监听器 - 暂停视频/音频播放、停止 canvas 动画等
再次进入:只触发 activated,跳过所有创建和挂载钩子
组件直接从内存缓存中恢复,插入 DOM,不重新执行 created、mounted 等。这意味着:
• 组件 data、computed、watcher 全部保持原样
• 表单输入、tab 选中、折叠状态、滚动条位置等 UI 状态自动保留
• 所有依赖这些状态的逻辑,必须放在 activated 中重新同步或刷新
- 例如:列表页切换回来时,需在
activated中检查数据是否过期,决定是否重新请求 - 又如:表单页返回后,若后端校验规则已更新,应在
activated中重置验证状态 - 注意:不要在
mounted里写“每次进页面都要跑”的逻辑,否则第二次起就失效了
最终销毁:unmounted 才真正出现
只有当组件被强制移出缓存时,才会走完整销毁流程。常见情况包括:
• 被 exclude 匹配排除
• 缓存数量超 max 限制,按 LRU 被淘汰
• 手动调用 include/exclude 动态变更,导致匹配失效
此时 beforeUnmount → unmounted 依次执行,deactivated 会先于它们触发(因为失活发生在销毁前)。











