在 Vue Router 中使用 <keep-alive> 缓存组件时,离开被缓存页面的组件钩子函数(如 beforeDestroy、destroyed)不会触发,但会触发 deactivated 钩子;未被缓存的组件则正常触发销毁钩子。以下是具体分析:
1. 被 <keep-alive> 缓存的组件行为- 不触发销毁钩子:当组件被 <keep-alive> 缓存时,离开页面不会触发 beforeDestroy 和 destroyed 钩子,因为组件实例未被销毁,而是进入“休眠”状态。
- 触发 deactivated 钩子:离开被缓存的组件时,会触发 deactivated 生命周期钩子,可用于执行离开时的逻辑(如暂停定时器、取消事件监听等)。
- 再次激活时触发 activated:当返回被缓存的组件时,会触发 activated 钩子,可用于恢复状态(如重新启动定时器、重新绑定事件等)。
2. 未被 <keep-alive> 缓存的组件行为- 正常触发销毁钩子:若组件未被 <keep-alive> 缓存(如未在 include 列表中,或未使用 <keep-alive> 包裹),离开页面时会正常触发 beforeDestroy 和 destroyed 钩子。
- 动态切换场景:若通过 v-if 动态切换组件,即使组件被 <keep-alive> 缓存,v-if 条件变化导致组件销毁时,仍会触发销毁钩子。但这种情况通常与路由切换无关,更多是局部组件的显示/隐藏。
3. 关键配置:include 属性- 精准控制缓存:通过 <keep-alive :include="['HomeIndex']"> 可指定仅缓存特定组件(如 HomeIndex)。未被 include 包含的组件在离开时会正常触发销毁钩子。
- 示例代码:<keep-alive include="HomeIndex"> <router-view></router-view></keep-alive>此时,仅 HomeIndex 组件会被缓存,其他路由组件离开时会触发 beforeDestroy 和 destroyed。
4. 实际应用建议- 需要缓存的场景:若组件数据昂贵(如列表页),使用 <keep-alive> 缓存可避免重复渲染,提升性能。此时需通过 activated/deactivated 管理状态。
- 不需要缓存的场景:若组件每次进入需重新加载数据(如详情页),可不缓存或通过 exclude 排除,确保销毁钩子正常触发。
总结- 被缓存组件:离开时触发 deactivated,不触发销毁钩子;返回时触发 activated。
- 未被缓存组件:离开时正常触发 beforeDestroy 和 destroyed。
- 配置建议:通过 include/exclude 精准控制缓存范围,平衡性能与状态管理需求。