14 【TS类型声明 keepAlive】
14 【TS类型声明 keepAlive】
1.Ts 类型声明使用 & 讲解
该文章未归纳完,那么多API肯定也说不完。。不过也涵盖了主要的组合式 API 的 TS类型。
核心:大部分都是运用API函数泛型来定义类型。
1.1 父组件相关的
1 |
|
1.2 子组件相关的
1 |
|
2.keep-alive
2.1 基本介绍
有时候我们不希望组件被重新渲染影响使用体验;或者处于性能考虑,避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。
开启keep-alive 生命周期的变化
- 初次进入时: onMounted> onActivated
- 退出后触发
deactivated
- 再次进入:
- 只会触发 onActivated
- 事件挂载的方法等,只执行一次的放在 onMounted中;组件每次进去执行的方法放在 onActivated中
1 |
|
Props:
- include - string | RegExp | Array。只有名称匹配的组件会被缓存。
- exclude - string | RegExp | Array。任何名称匹配的组件都不会被缓存。
- max - number | string。最多可以缓存多少组件实例。
用法:
<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition>
相似,<keep-alive>
是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中。
主要用于保留组件状态或避免重新渲染。
注意事项:
优先级: 如果
exclude
和include
内都有同个组件名,exclude
优先级高于include
缓存销毁:
max
当已缓存的组件数量超过max
值,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。生命周期: 被缓存的组件才会调用
activated
这些缓存相关的生命周期 ,换句话说就是exclude
内的组件不会触发 activated!!离开组件、再度激活: 当组件在
<keep-alive>
内被切换时,它的 mounted 和 unmounted 生命周期钩子不会被调用,取而代之的是 activated 和 deactivated。(这会运用在<keep-alive>
的直接子节点及其所有子孙节点。)
2.2 使用案例
1 |
|
include
和exclude
include
和exclude
prop 允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:
1 |
|
使用了 include / exclude 后,必须显式声明组件的 name !!!
这样才能与缓存组件匹配、生效。
提示
在 3.2.34 或以上的版本中, 使用
<script setup>
的单文件组件会自动根据文件名生成对应的name
选项,无需再手动声明。
注意,<keep-alive>
是用在其一个直属的子组件被切换的情形。如果你在其中有 v-for
则不会工作。如果有上述的多个条件性的子元素,<keep-alive>
要求同时只有一个子元素被渲染。
2.3 缓存实例的生命周期
当一个组件实例从 DOM 上移除但因为被 <KeepAlive>
缓存而仍作为组件树的一部分时,它将变为不活跃状态而不是被卸载。当一个组件实例作为缓存树的一部分插入到 DOM 中时,它将重新被激活。
一个持续存在的组件可以通过 onActivated()
和 onDeactivated()
注册相应的两个状态的生命周期钩子:
1 |
|
请注意:
onActivated
在组件挂载时也会调用,并且onDeactivated
在组件卸载时也会调用。- 这两个钩子不仅适用于
<KeepAlive>
缓存的根组件,也适用于缓存树中的后代组件。