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