useTabs.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { useTimeoutFn } from '@vueuse/core';
  2. import { PageEnum } from '/@/enums/pageEnum';
  3. import { TabItem, tabStore } from '/@/store/modules/tab';
  4. import { appStore } from '/@/store/modules/app';
  5. import router from '/@/router';
  6. import { ref } from 'vue';
  7. import { pathToRegexp } from 'path-to-regexp';
  8. const activeKeyRef = ref<string>('');
  9. type Fn = () => void;
  10. type RouteFn = (tabItem: TabItem) => void;
  11. interface TabFn {
  12. refreshPageFn: RouteFn;
  13. closeAllFn: Fn;
  14. closeLeftFn: RouteFn;
  15. closeRightFn: RouteFn;
  16. closeOtherFn: RouteFn;
  17. closeCurrentFn: RouteFn;
  18. }
  19. let refreshPage: RouteFn;
  20. let closeAll: Fn;
  21. let closeLeft: RouteFn;
  22. let closeRight: RouteFn;
  23. let closeOther: RouteFn;
  24. let closeCurrent: RouteFn;
  25. export let isInitUseTab = false;
  26. export function useTabs() {
  27. function initTabFn({
  28. refreshPageFn,
  29. closeAllFn,
  30. closeLeftFn,
  31. closeRightFn,
  32. closeOtherFn,
  33. closeCurrentFn,
  34. }: TabFn) {
  35. if (isInitUseTab) return;
  36. refreshPageFn && (refreshPage = refreshPageFn);
  37. closeAllFn && (closeAll = closeAllFn);
  38. closeLeftFn && (closeLeft = closeLeftFn);
  39. closeRightFn && (closeRight = closeRightFn);
  40. closeOtherFn && (closeOther = closeOtherFn);
  41. closeCurrentFn && (closeCurrent = closeCurrentFn);
  42. isInitUseTab = true;
  43. }
  44. function resetCache() {
  45. const def = undefined as any;
  46. refreshPage = def;
  47. closeAll = def;
  48. closeLeft = def;
  49. closeRight = def;
  50. closeOther = def;
  51. closeCurrent = def;
  52. }
  53. function canIUseFn(): boolean {
  54. const { getProjectConfig } = appStore;
  55. const { multiTabsSetting: { show } = {} } = getProjectConfig;
  56. if (!show) {
  57. throw new Error('当前未开启多标签页,请在设置中打开!');
  58. }
  59. return !!show;
  60. }
  61. function getTo(path: string): any {
  62. const routes = router.getRoutes();
  63. const fn = (p: string): any => {
  64. const to = routes.find((item) => {
  65. if (item.path === '/:path(.*)*') return;
  66. const regexp = pathToRegexp(item.path);
  67. return regexp.test(p);
  68. });
  69. if (!to) return '';
  70. if (!to.redirect) return to;
  71. if (to.redirect) {
  72. return getTo(to.redirect as string);
  73. }
  74. };
  75. return fn(path);
  76. }
  77. return {
  78. initTabFn,
  79. refreshPage: () => canIUseFn() && refreshPage(tabStore.getCurrentTab),
  80. closeAll: () => canIUseFn() && closeAll(),
  81. closeLeft: () => canIUseFn() && closeLeft(tabStore.getCurrentTab),
  82. closeRight: () => canIUseFn() && closeRight(tabStore.getCurrentTab),
  83. closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab),
  84. closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab),
  85. resetCache: () => canIUseFn() && resetCache(),
  86. addTab: (
  87. path: PageEnum | string,
  88. goTo = false,
  89. opt?: { replace?: boolean; query?: any; params?: any }
  90. ) => {
  91. const to = getTo(path);
  92. if (!to) return;
  93. useTimeoutFn(() => {
  94. tabStore.addTabByPathAction();
  95. }, 0);
  96. const { replace, query = {}, params = {} } = opt || {};
  97. activeKeyRef.value = path;
  98. const data = {
  99. path,
  100. query,
  101. params,
  102. };
  103. goTo && replace ? router.replace(data) : router.push(data);
  104. },
  105. activeKeyRef,
  106. };
  107. }