useFrameKeepAlive.ts 1.6 KB
Newer Older
陈文彬 已提交
1 2 3 4 5 6 7 8
import { computed, toRaw, unref } from 'vue';

import { tabStore } from '/@/store/modules/tab';
import { appStore } from '/@/store/modules/app';

import { AppRouteRecordRaw } from '/@/router/types';
import { useRouter } from 'vue-router';
import router from '/@/router';
N
nebv 已提交
9
import { unique } from '/@/utils';
陈文彬 已提交
10 11 12 13 14

export function useFrameKeepAlive() {
  const { currentRoute } = useRouter();

  function getAllFramePages(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {
N
nebv 已提交
15
    let res: AppRouteRecordRaw[] = [];
陈文彬 已提交
16 17 18 19 20 21 22 23 24
    for (const route of routes) {
      const { meta: { frameSrc } = {}, children } = route;
      if (frameSrc) {
        res.push(route);
      }
      if (children && children.length) {
        res.push(...getAllFramePages(children));
      }
    }
N
nebv 已提交
25
    res = unique(res, 'name');
陈文彬 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    return res;
  }

  function showIframe(item: AppRouteRecordRaw) {
    return item.path === unref(currentRoute).path;
  }
  const getFramePages = computed(() => {
    const ret =
      getAllFramePages((toRaw(router.getRoutes()) as unknown) as AppRouteRecordRaw[]) || [];
    return ret;
  });

  const getOpenTabList = computed((): string[] => {
    return tabStore.getTabsState.reduce((prev: string[], next) => {
      if (next.meta && Reflect.has(next.meta, 'frameSrc')) {
        prev.push(next.path);
      }
      return prev;
    }, []);
  });

  function hasRenderFrame(path: string) {
    const {
      multiTabsSetting: { show },
    } = appStore.getProjectConfig;
    return show ? unref(getOpenTabList).includes(path) : true;
  }
  return { hasRenderFrame, getFramePages, showIframe, getAllFramePages };
}