-
Notifications
You must be signed in to change notification settings - Fork 1
KeepAlive
Ray Hao edited this page Jun 5, 2024
·
4 revisions
- 自动收集、释放缓存
- 定时清理无效缓存
- 支持通过路由对象进行缓存
interface KeepAliveOptions {
/**
* 是否自动在路由前进时收集,后退时清理缓存,可用于模拟移动端缓存处理
* @default true
*/
autoCollectAndClean?: MaybeRefOrGetter<boolean>
/**
* 添加路由缓存前执行,返回假值将阻止添加
*/
beforeRouteAdd?: (route: LoadableRoute) => Awaitable<void | boolean>
/**
* 删除路由缓存前执行,返回假值将阻止删除
*/
beforeRouteRemove?: (route: LoadableRoute) => Awaitable<void | boolean>
/**
* 缓存保鲜时间,设置大于 `0` 后将开启定时器清理过期缓存
*/
staleTime?: number
}
interface KeepAlive {
/**
* 插件 ID
*/
id: PluginID<KeepAlive>
/**
* 配置项
*/
options: KeepAliveOptions
/**
* 缓存的组件名称列表
*/
readonly values: string[]
/**
* 是否自动模式
* @default true
*/
readonly isAuto: boolean
/**
* 启动缓存保鲜定时器
*/
startStaleTimer: () => void
/**
* 停止缓存保鲜定时器
*/
stopStaleTimer: () => void
/**
* 清理过期缓存,设置 `options.staleTime > 0` 后有效
*/
clearExpired: () => void
/**
* 切换自动模式
* @param value 状态值
*/
toggleAuto: (value?: boolean) => boolean
/**
* 启用自动模式
*/
enableAuto: () => boolean
/**
* 禁用自动模式
*/
disableAuto: () => boolean
/**
* 添加路由缓存
* @param name 需要缓存的路由组件名称
*/
add: {
(name: string): void
(route: LoadableRoute): Promise<void>
}
/**
* 移除路由缓存
* @param name 需要移除的路由组件名称
*/
remove: {
(name: string): void
(route: LoadableRoute): Promise<void>
}
/**
* 刷新路由缓存
* @param name 需要刷新的路由组件名称
*/
refresh: {
(name: string): void
(route: LoadableRoute): Promise<void>
}
/**
* 清空缓存列表
*/
clear: () => void
/**
* 设置缓存的名称列表,会覆盖旧列表
* @param values 缓存名称列表
*/
set: (values: string[]) => void
/**
* 插件安装
*/
install: (sdk: AppSDKInternalInstance) => Uninstall
}
// sdk.ts
import { createAppSDK, createKeepAlive } from 'vue-app-sdk'
export const sdk = createAppSDK()
sdk.use(
createKeepAlive({
// 自动在路由前进后退时收集和清理缓存
autoCollectAndClean: true,
// 根据路由添加缓存前回调,返回假值将阻止添加
beforeRouteAdd: (route) => route.meta.isKeepAlive,
})
)
在调用
sdk.cleanup()
时自动清理缓存列表。
<!-- App.vue -->
<script setup>
import { useAppSDK, KEEP_ALIVE_ID } from 'vue-app-sdk'
const keepAlive = useAppSDK().getPlugin(KEEP_ALIVE_ID)!
</script>
<template>
<div class="view-container">
<RouterView v-slot="{ Component, route }">
<KeepAlive :include="keepAlive.values">
<Component
:is="Component"
:key="route.fullPath"
/>
</KeepAlive>
</RouterView>
</div>
</template>
<script setup lang="ts">
// ...
const showView = ref(true)
const route = useRoute()
function refreshCurrentPage() {
// 刷新路由页面缓存
const promise = keepAlive.refresh(route)
// 隐藏视图
showView.value = false
// 缓存刷新结束后显示视图
promise
// 避免视图更新时机过早
.then(() => nextTick())
.then(() => {
showView.value = true
})
}
</script>
<template>
<div class="view-container">
<RouterView v-slot="{ Component, route }">
<KeepAlive :include="keepAlive.values">
<Component
v-if="showView"
:is="Component"
:key="route.fullPath"
/>
</KeepAlive>
</RouterView>
</div>
</template>
常用于列表页,这类页面缓存需要被定期清理,以保证用户能及时获取到正确的列表数据。
// sdk.ts
// ...
sdk.use(
createKeepAlive({
// ...
// 缓存保鲜时间设为 10 分钟,当页面缓存过期时将被清理
staleTime: 10 * 60e3
})
)