You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.7 KiB
56 lines
1.7 KiB
|
7 months ago
|
import { computed, toRaw, unref } from 'vue'
|
||
|
|
import { uniqBy } from 'lodash-es'
|
||
|
|
import { useRouter } from 'vue-router'
|
||
|
|
import type { AppRouteRecordRaw } from '@/router/types'
|
||
|
|
|
||
|
|
import { useMultipleTabStore } from '@/store/modules/multipleTab'
|
||
|
|
|
||
|
|
import { useMultipleTabSetting } from '@/hooks/setting/useMultipleTabSetting'
|
||
|
|
|
||
|
|
export function useFrameKeepAlive() {
|
||
|
|
const router = useRouter()
|
||
|
|
const { currentRoute } = router
|
||
|
|
const { getShowMultipleTab } = useMultipleTabSetting()
|
||
|
|
const tabStore = useMultipleTabStore()
|
||
|
|
const getFramePages = computed(() => {
|
||
|
|
const ret = getAllFramePages(toRaw(router.getRoutes()) as unknown as AppRouteRecordRaw[]) || []
|
||
|
|
return ret
|
||
|
|
})
|
||
|
|
|
||
|
|
const getOpenTabList = computed((): string[] => {
|
||
|
|
return tabStore.getTabList.reduce((prev: string[], next) => {
|
||
|
|
if (next.meta && Reflect.has(next.meta, 'frameSrc'))
|
||
|
|
prev.push(next.name as string)
|
||
|
|
|
||
|
|
return prev
|
||
|
|
}, [])
|
||
|
|
})
|
||
|
|
|
||
|
|
function getAllFramePages(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {
|
||
|
|
let res: AppRouteRecordRaw[] = []
|
||
|
|
for (const route of routes) {
|
||
|
|
const { meta: { frameSrc } = {}, children } = route
|
||
|
|
if (frameSrc)
|
||
|
|
res.push(route)
|
||
|
|
|
||
|
|
if (children && children.length)
|
||
|
|
res.push(...getAllFramePages(children))
|
||
|
|
}
|
||
|
|
res = uniqBy(res, 'name')
|
||
|
|
return res
|
||
|
|
}
|
||
|
|
|
||
|
|
function showIframe(item: AppRouteRecordRaw) {
|
||
|
|
return item.name === unref(currentRoute).name
|
||
|
|
}
|
||
|
|
|
||
|
|
function hasRenderFrame(name: string) {
|
||
|
|
if (!unref(getShowMultipleTab))
|
||
|
|
return router.currentRoute.value.name === name
|
||
|
|
|
||
|
|
return unref(getOpenTabList).includes(name)
|
||
|
|
}
|
||
|
|
|
||
|
|
return { hasRenderFrame, getFramePages, showIframe, getAllFramePages }
|
||
|
|
}
|