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

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 }
}