Skip to content

KeepAlive:组件缓存、激活生命周期与状态保留代价

主题边界

  • KeepAlive 的作用不是“性能更高”这么简单,而是保留组件实例、状态和部分 DOM 结构,避免反复卸载重建。
  • 它适合标签页、详情返回、表单草稿保留等场景,但缓存本身也有代价。

机制与流程

  • 被 KeepAlive 包裹的组件切走时不会真正卸载,而是进入缓存池;再次展示时直接激活已有实例。
  • activated / deactivated 钩子用于补充挂载/卸载之外的状态同步和副作用收口逻辑。
  • include / exclude / max 控制缓存命中和淘汰策略,max 本质上引入近似 LRU 的缓存限制。

关键差异

  • KeepAlive 保留的是组件实例级状态,不是业务数据缓存系统;接口数据是否复用仍需单独设计。
  • 和普通条件渲染相比,KeepAlive 用空间换时间,避免反复初始化但增加内存常驻。

边界条件

  • 被缓存的组件如果持有订阅、轮询、媒体流或全局监听,必须在 deactivated 时有明确停用策略。
  • 并不是所有页面都值得缓存,尤其是状态体积大、切换频率低或数据实时性要求高的页面。

工程落点

  • 路由 tab、表单回填和二级页面返回体验,经常是 KeepAlive 是否合理使用的分水岭。
  • 这道题和生命周期、路由、状态管理、内存泄漏很容易形成追问链。

相关主题