面试题答案
一键面试Keep - Alive保存和恢复组件状态的原理
- 保存状态:
- Keep - Alive 是 Vue 的内置组件,它主要通过缓存组件实例来保存组件状态。当一个组件被 Keep - Alive 包裹时,在组件被切换出去(例如通过路由切换),它不会被销毁,而是被缓存起来。
- 对于
data
属性,由于data
是组件实例的属性,在组件被缓存时,data
的数据状态也随之被缓存。例如,如果一个组件的data
中有一个计数器count
,当组件被切换出去时,count
的当前值会被保留在缓存的组件实例中。 computed
属性同样依赖于组件实例,并且具有缓存机制。在组件被缓存时,computed
相关的依赖追踪和计算结果也会被保留。当组件再次被激活时,computed
会基于缓存的状态和依赖关系进行计算。
- 恢复状态:
- 当被 Keep - Alive 缓存的组件再次被切换回来(激活)时,Vue 会从缓存中取出之前的组件实例,直接复用该实例,从而恢复组件的状态。
- 这意味着
data
中的数据会保持切换出去之前的状态,computed
也会基于之前缓存的状态和依赖关系重新计算(如果依赖有变化),就好像组件没有被切换出去过一样。
不同生命周期钩子函数中 Keep - Alive 对组件状态操作的差异
- activated:
- 当被 Keep - Alive 缓存的组件被激活时,会触发
activated
钩子函数。 - 在这个钩子函数中,组件已经从缓存中恢复,此时
data
和computed
等状态已经恢复到切换出去之前的状态。可以在这个钩子函数中执行一些需要在组件每次激活时进行的操作,例如重新加载一些数据(如果数据在组件未激活期间可能有变化),但不需要重新初始化data
等状态,因为它们已经被 Keep - Alive 缓存并恢复。
- 当被 Keep - Alive 缓存的组件被激活时,会触发
- deactivated:
- 当组件被切换出去(失活)时,会触发
deactivated
钩子函数。 - 在这个钩子函数中,组件即将被缓存,
data
和computed
等状态会随着组件实例一起被缓存。可以在这个钩子函数中执行一些清理操作,例如清除定时器、解绑事件监听器等,但不需要手动保存data
等状态,因为 Keep - Alive 会自动处理缓存。
- 当组件被切换出去(失活)时,会触发
- created、mounted 等常规生命周期钩子:
- 在组件首次创建(
created
)和挂载(mounted
)时,Keep - Alive 并不影响这些钩子函数的正常执行。但是,当组件被缓存后再次激活时,这些钩子函数不会再次执行,因为组件实例是复用的,并非重新创建和挂载。这与正常情况下组件的切换和重新渲染是不同的,需要注意在这些钩子函数中执行的初始化操作不会在组件激活时重复执行。
- 在组件首次创建(