Appearance
KeepAlive:组件缓存、激活生命周期与状态保留代价
主题边界
- KeepAlive 的作用不是“性能更高”这么简单,而是保留组件实例、状态和部分 DOM 结构,避免反复卸载重建。
- 它适合标签页、详情返回、表单草稿保留等场景,但缓存本身也有代价。
机制与流程
- 被 KeepAlive 包裹的组件切走时不会真正卸载,而是进入缓存池;再次展示时直接激活已有实例。
activated/deactivated钩子用于补充挂载/卸载之外的状态同步和副作用收口逻辑。- include / exclude / max 控制缓存命中和淘汰策略,
max本质上引入近似 LRU 的缓存限制。
关键差异
- KeepAlive 保留的是组件实例级状态,不是业务数据缓存系统;接口数据是否复用仍需单独设计。
- 和普通条件渲染相比,KeepAlive 用空间换时间,避免反复初始化但增加内存常驻。
边界条件
- 被缓存的组件如果持有订阅、轮询、媒体流或全局监听,必须在
deactivated时有明确停用策略。 - 并不是所有页面都值得缓存,尤其是状态体积大、切换频率低或数据实时性要求高的页面。
工程落点
- 路由 tab、表单回填和二级页面返回体验,经常是 KeepAlive 是否合理使用的分水岭。
- 这道题和生命周期、路由、状态管理、内存泄漏很容易形成追问链。