面试题答案
一键面试Keep - Alive组件工作原理
- 缓存组件实例:
- Keep - Alive是Vue内置的一个抽象组件,它自身不会渲染一个DOM元素,也不会出现在父组件链中。
- 当它包裹的组件被切换时,不是销毁组件实例,而是将组件实例缓存起来。它内部维护了一个缓存对象
cache
,以组件的key
作为键(如果没有设置key
,则会根据组件的name
选项或者组件自身的id
来生成key
),缓存的组件VNode作为值。 - 例如,当有两个组件A和B,通过
keep - alive
包裹并切换显示时,A组件首次渲染后,其VNode会被缓存到cache
中,当从B组件切回A组件时,直接从cache
中取出A组件的VNode进行渲染,而不是重新创建A组件实例。
- 缓存和激活组件时的生命周期钩子变化:
-
缓存时:
- 当组件被缓存时,会触发
deactivated
生命周期钩子。这个钩子可以用于处理一些需要在组件停止使用时执行的逻辑,比如清除定时器等。
- 当组件被缓存时,会触发
-
激活时:
- 当缓存的组件被重新激活时,会触发
activated
生命周期钩子。这个钩子可以用于处理一些需要在组件重新使用时执行的逻辑,比如重新初始化数据等。与created
和mounted
不同,activated
是在组件从缓存中被重新启用时触发,而created
是在组件实例刚被创建时触发,mounted
是在组件挂载到DOM后触发。
- 当缓存的组件被重新激活时,会触发
-
正常创建和销毁:
- 如果组件没有被
keep - alive
包裹,组件正常创建时会依次触发beforeCreate
、created
、beforeMount
、mounted
生命周期钩子;销毁时会依次触发beforeDestroy
、destroyed
。但当被keep - alive
包裹后,beforeDestroy
和destroyed
不会触发,取而代之的是deactivated
。同样,再次激活时不会触发beforeCreate
、created
、beforeMount
、mounted
,而是触发activated
。
- 如果组件没有被
-