该文章未归纳完,那么多API肯定也说不完。。不过也涵盖了主要的组合式 API 的 TS类型。
核心:大部分都是运用API函数泛型来定义类型。
测试
{{a}}
{{a2}}
{{pbook.title}}
有时候我们不希望组件被重新渲染影响使用体验;或者处于性能考虑,避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。
开启keep-alive 生命周期的变化
deactivated
Props:
用法:
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 相似, 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中。
主要用于保留组件状态或避免重新渲染。
注意事项:
优先级: 如果
exclude和include内都有同个组件名,exclude优先级高于include缓存销毁:
max当已缓存的组件数量超过max值,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。生命周期: 被缓存的组件才会调用
activated这些缓存相关的生命周期 ,换句话说就是exclude内的组件不会触发 activated!!离开组件、再度激活: 当组件在
内被切换时,它的 mounted 和 unmounted 生命周期钩子不会被调用,取而代之的是 activated 和 deactivated。(这会运用在的直接子节点及其所有子孙节点。)
<template>
<keep-alive :exclude="['test1']" :include="['test1','test2']" max='1'>
<component :is='dynamic'>component>
keep-alive>
<el-button @click='changeComponent'>更改组件el-button>
template>
<script setup lang="ts">
import test1 from './test-components/test1.vue'
import test2 from './test-components/test2.vue'
import { ref,shallowRef } from 'vue'
let dynamic:any = shallowRef(test1)
let state = ref(true)
function changeComponent() {
if (state.value) {
dynamic.value = test2
}else{
dynamic.value = test1
}
state.value = !state.value
}
script>
include 和 exclude
include 和 exclude prop 允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:
使用了 include / exclude 后,必须显式声明组件的 name !!!
这样才能与缓存组件匹配、生效。
提示
在 3.2.34 或以上的版本中, 使用
的单文件组件会自动根据文件名生成对应的name选项,无需再手动声明。
注意, 是用在其一个直属的子组件被切换的情形。如果你在其中有 v-for 则不会工作。如果有上述的多个条件性的子元素, 要求同时只有一个子元素被渲染。
当一个组件实例从 DOM 上移除但因为被 缓存而仍作为组件树的一部分时,它将变为不活跃状态而不是被卸载。当一个组件实例作为缓存树的一部分插入到 DOM 中时,它将重新被激活。
一个持续存在的组件可以通过 onActivated() 和 onDeactivated() 注册相应的两个状态的生命周期钩子:
<script setup>
import { onActivated, onDeactivated } from 'vue'
onActivated(() => {
// 调用时机为首次挂载
// 以及每次从缓存中被重新插入时
})
onDeactivated(() => {
// 在从 DOM 上移除、进入缓存
// 以及组件卸载时调用
})
</script>
请注意:
onActivated 在组件挂载时也会调用,并且 onDeactivated 在组件卸载时也会调用。 缓存的根组件,也适用于缓存树中的后代组件。