useFrameKeepAlive.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import type { AppRouteRecordRaw } from '@jeesite/core/router/types';
  2. import { computed, toRaw, ref, unref } from 'vue';
  3. import { useMultipleTabStore } from '@jeesite/core/store/modules/multipleTab';
  4. import { uniqBy } from 'lodash-es';
  5. import { useMultipleTabSetting } from '@jeesite/core/hooks/setting/useMultipleTabSetting';
  6. import { useFullContent } from '@jeesite/core/hooks/web/useFullContent';
  7. import { RouteRecordRaw, useRouter } from 'vue-router';
  8. import { LAYOUT, IFRAME_BLANK } from '@jeesite/core/router/constant';
  9. import { router } from '@jeesite/core/router';
  10. const framePages = ref<AppRouteRecordRaw[]>();
  11. const tempFramePages = ref<AppRouteRecordRaw[]>();
  12. export function useFrameKeepAlive() {
  13. const router = useRouter();
  14. const { currentRoute } = router;
  15. const { getShowMultipleTab } = useMultipleTabSetting();
  16. const { getFullContent } = useFullContent();
  17. const tabStore = useMultipleTabStore();
  18. const getFramePages = computed(() => {
  19. if (!unref(framePages.value)) {
  20. framePages.value = getAllFramePages(toRaw(router.getRoutes()) as AppRouteRecordRaw[]);
  21. }
  22. return [...(framePages.value || []), ...(tempFramePages.value || [])];
  23. });
  24. const getOpenTabList = computed((): string[] => {
  25. return tabStore.getTabList.reduce((prev: string[], next) => {
  26. if (next.meta && Reflect.has(next.meta, 'frameSrc')) {
  27. prev.push(next.name as string);
  28. }
  29. return prev;
  30. }, []);
  31. });
  32. function getAllFramePages(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {
  33. let res: AppRouteRecordRaw[] = [];
  34. for (const route of routes) {
  35. const { meta: { frameSrc } = {}, children } = route;
  36. if (frameSrc && !route.name.startsWith('JeeSite')) {
  37. res.push(route);
  38. }
  39. if (children && children.length) {
  40. res.push(...getAllFramePages(children));
  41. }
  42. }
  43. res = uniqBy(res, 'name');
  44. return (res || []) as AppRouteRecordRaw[];
  45. }
  46. function showIframe(item: AppRouteRecordRaw) {
  47. return item.name === unref(currentRoute).name;
  48. }
  49. function hasRenderFrame(name: string) {
  50. if (!unref(getShowMultipleTab) || unref(getFullContent)) {
  51. return router.currentRoute.value.name === name;
  52. }
  53. return unref(getOpenTabList).includes(name);
  54. }
  55. return { hasRenderFrame, getFramePages, showIframe, getAllFramePages };
  56. }
  57. export function initFramePage() {
  58. tempFramePages.value = JSON.parse(sessionStorage.getItem('temp-frame-pages') || '[]');
  59. tempFramePages.value?.forEach((r) => addFramePage(r, false));
  60. return addFramePage;
  61. }
  62. function addFramePage(route: AppRouteRecordRaw, store = true) {
  63. if (store) {
  64. let array = tempFramePages.value || [];
  65. if (array.length > 10) {
  66. array = array.slice(-10);
  67. }
  68. for (let i = array.length - 1; i >= 0; i--) {
  69. if (array[i].name === route.name) {
  70. array.splice(i, 1);
  71. }
  72. }
  73. const currentRoute = router.currentRoute.value;
  74. route.meta.currentActiveMenu = currentRoute.meta.currentActiveMenu || currentRoute.path;
  75. array.push(route);
  76. tempFramePages.value = array;
  77. sessionStorage.setItem('temp-frame-pages', JSON.stringify(array));
  78. }
  79. router.addRoute({
  80. component: LAYOUT,
  81. meta: { single: true, affix: false },
  82. name: `${route.name}Parent`,
  83. children: [
  84. {
  85. component: IFRAME_BLANK,
  86. ...route,
  87. },
  88. ],
  89. } as unknown as RouteRecordRaw);
  90. }