keep-alive是一个内置组件,它的主要作用是缓存不活动的组件实例,而不是销毁它们。这可以达到节省请求、优化性能的目的。当组件被keep-alive包裹时,Vue会为该组件额外增加两个生命周期钩子:
activated
触发时机:当组件被keep-alive缓存后,再次进入该组件的可见区域时触发。
用途:主要用于执行组件重新激活时需要的操作,如更新数据或执行DOM操作。这个钩子相当于传统意义上的组件重新渲染或激活的入口。
deactivated
触发时机:当组件被keep-alive缓存,且从可见区域离开时触发。
用途:执行组件停用时的清理工作,如取消定时器、解绑事件监听器等。这个钩子帮助管理组件的退出状态,确保资源得到正确释放。
生命周期执行情况
首次进入组件
如果组件被keep-alive包裹,那么首次进入时会执行beforeCreate、created、beforeMount、mounted以及activated这五个生命周期钩子。
如果组件没有被keep-alive包裹,则只会执行前四个钩子:beforeCreate、created、beforeMount、mounted。
非首次进入组件
如果组件被keep-alive包裹,那么之后每次进入时只会执行activated这一个生命周期钩子,因为组件实例被缓存了,没有重新创建。
如果组件没有被keep-alive包裹,则每次进入都会执行完整的生命周期流程,即beforeCreate、created、beforeMount、mounted。
其他
keep-alive可以通过include和exclude属性来控制哪些组件需要被缓存,以及哪些组件不应该被缓存。
当使用keep-alive时,如果需要在每次进入页面时获取最新的数据,通常需要在activated钩子中进行数据请求,而不是在created或mounted钩子中。
需要注意的是,keep-alive会将数据保留在内存中,因此在某些情况下可能会导致内存占用过高。因此,在使用时需要权衡其优缺点,并根据实际需求进行选择。