Template
1
0
mirror of https://github.com/un-pany/v3-admin-vite.git synced 2025-04-21 11:29:20 +08:00

feat: 新增一种 keep-alive 缓存方案 (#119)

This commit is contained in:
HavocZ 2023-08-28 17:34:28 +08:00 committed by GitHub
parent a7e078930c
commit 28f1c0718b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -0,0 +1,56 @@
import { useTagsViewStore } from "@/store/modules/tags-view"
import type { VNode } from "vue"
import { h } from "vue"
import { KeepAlive, cloneVNode, createVNode, defineComponent } from "vue"
import { useRoute } from "vue-router"
interface CompConsumerProps {
component?: VNode
}
const compMap = new Map<string, VNode>()
export const CompConsumer = defineComponent(
(props: CompConsumerProps) => {
const tagsViewStore = useTagsViewStore()
const route = useRoute()
return () => {
const component = props.component
// 判断当前是否包含name如果不包含name那就直接处理掉name
if (!route.name) return component
// 获取当前组件的name
const compName = (component?.type as any)?.name
const routeName = route.name as string
let Comp: VNode
if (compMap.has(routeName)) {
// @ts-expect-error this is Node
Comp = compMap.get(routeName)
} else {
const node = cloneVNode(component!)
if (compName && compName === routeName)
// @ts-expect-error this is obj
node.type.name = `__${compName}__` + "CUSTOM_NAME"
// @ts-expect-error this is VNode
// eslint-disable-next-line vue/one-component-per-file
Comp = defineComponent({
name: routeName,
setup() {
return () => node
}
})
compMap.set(routeName, Comp)
}
return createVNode(
KeepAlive,
{
include: tagsViewStore.cachedViews
},
{
default: () => h(Comp)
}
)
}
// eslint-disable-next-line vue/one-component-per-file
},
{
name: "CompConsumer",
props: ["component"]
}
)