123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import type { AppRouteRecordRaw } from '/@/router/types.d';
- import { useTimeout } from '/@/hooks/core/useTimeout';
- import { PageEnum } from '/@/enums/pageEnum';
- import { TabItem, tabStore } from '/@/store/modules/tab';
- import { appStore } from '/@/store/modules/app';
- import router from '/@/router';
- import { ref } from 'vue';
- const activeKeyRef = ref<string>('');
- type Fn = () => void;
- type RouteFn = (tabItem: TabItem) => void;
- interface TabFn {
- refreshPageFn: RouteFn;
- closeAllFn: Fn;
- closeLeftFn: RouteFn;
- closeRightFn: RouteFn;
- closeOtherFn: RouteFn;
- closeCurrentFn: RouteFn;
- }
- let refreshPage: RouteFn;
- let closeAll: Fn;
- let closeLeft: RouteFn;
- let closeRight: RouteFn;
- let closeOther: RouteFn;
- let closeCurrent: RouteFn;
- export let isInitUseTab = false;
- export function useTabs() {
- function initTabFn({
- refreshPageFn,
- closeAllFn,
- closeLeftFn,
- closeRightFn,
- closeOtherFn,
- closeCurrentFn,
- }: TabFn) {
- if (isInitUseTab) return;
- refreshPageFn && (refreshPage = refreshPageFn);
- closeAllFn && (closeAll = closeAllFn);
- closeLeftFn && (closeLeft = closeLeftFn);
- closeRightFn && (closeRight = closeRightFn);
- closeOtherFn && (closeOther = closeOtherFn);
- closeCurrentFn && (closeCurrent = closeCurrentFn);
- isInitUseTab = true;
- }
- function resetCache() {
- const def = undefined as any;
- refreshPage = def;
- closeAll = def;
- closeLeft = def;
- closeRight = def;
- closeOther = def;
- closeCurrent = def;
- }
- function canIUseFn(): boolean {
- const { getProjectConfig } = appStore;
- const { multiTabsSetting: { show } = {} } = getProjectConfig;
- if (!show) {
- throw new Error('当前未开启多标签页,请在设置中打开!');
- }
- return !!show;
- }
- function getTo(path: string): any {
- const routes = router.getRoutes();
- const fn = (p: string): any => {
- const to = routes.find((item) => item.path === p);
- if (!to) return '';
- if (!to.redirect) return to;
- if (to.redirect) {
- return getTo(to.redirect as string);
- }
- };
- return fn(path);
- }
- return {
- initTabFn,
- refreshPage: () => canIUseFn() && refreshPage(tabStore.getCurrentTab),
- closeAll: () => canIUseFn() && closeAll(),
- closeLeft: () => canIUseFn() && closeLeft(tabStore.getCurrentTab),
- closeRight: () => canIUseFn() && closeRight(tabStore.getCurrentTab),
- closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab),
- closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab),
- resetCache: () => canIUseFn() && resetCache(),
- addTab: (path: PageEnum, goTo = false, replace = false) => {
- const to = getTo(path);
- if (!to) return;
- useTimeout(() => {
- tabStore.addTabByPathAction((to as unknown) as AppRouteRecordRaw);
- }, 0);
- activeKeyRef.value = to.path;
- goTo && replace ? router.replace : router.push(to.path);
- },
- activeKeyRef,
- };
- }
|