useTabs.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { useTimeout } from '/@/hooks/core/useTimeout';
  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. const activeKeyRef = ref<string>('');
  8. type Fn = () => void;
  9. type RouteFn = (tabItem: TabItem) => void;
  10. interface TabFn {
  11. refreshPageFn: RouteFn;
  12. closeAllFn: Fn;
  13. closeLeftFn: RouteFn;
  14. closeRightFn: RouteFn;
  15. closeOtherFn: RouteFn;
  16. closeCurrentFn: RouteFn;
  17. }
  18. let refreshPage: RouteFn;
  19. let closeAll: Fn;
  20. let closeLeft: RouteFn;
  21. let closeRight: RouteFn;
  22. let closeOther: RouteFn;
  23. let closeCurrent: RouteFn;
  24. export let isInitUseTab = false;
  25. export function useTabs() {
  26. function initTabFn({
  27. refreshPageFn,
  28. closeAllFn,
  29. closeLeftFn,
  30. closeRightFn,
  31. closeOtherFn,
  32. closeCurrentFn,
  33. }: TabFn) {
  34. if (isInitUseTab) return;
  35. refreshPageFn && (refreshPage = refreshPageFn);
  36. closeAllFn && (closeAll = closeAllFn);
  37. closeLeftFn && (closeLeft = closeLeftFn);
  38. closeRightFn && (closeRight = closeRightFn);
  39. closeOtherFn && (closeOther = closeOtherFn);
  40. closeCurrentFn && (closeCurrent = closeCurrentFn);
  41. isInitUseTab = true;
  42. }
  43. function resetCache() {
  44. const def = undefined as any;
  45. refreshPage = def;
  46. closeAll = def;
  47. closeLeft = def;
  48. closeRight = def;
  49. closeOther = def;
  50. closeCurrent = def;
  51. }
  52. function canIUseFn(): boolean {
  53. const { getProjectConfig } = appStore;
  54. const { multiTabsSetting: { show } = {} } = getProjectConfig;
  55. if (!show) {
  56. throw new Error('当前未开启多标签页,请在设置中打开!');
  57. }
  58. return !!show;
  59. }
  60. return {
  61. initTabFn,
  62. refreshPage: () => canIUseFn() && refreshPage(tabStore.getCurrentTab),
  63. closeAll: () => canIUseFn() && closeAll(),
  64. closeLeft: () => canIUseFn() && closeLeft(tabStore.getCurrentTab),
  65. closeRight: () => canIUseFn() && closeRight(tabStore.getCurrentTab),
  66. closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab),
  67. closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab),
  68. resetCache: () => canIUseFn() && resetCache(),
  69. addTab: (path: PageEnum, goTo = false, replace = false) => {
  70. useTimeout(() => {
  71. tabStore.addTabByPathAction(path);
  72. }, 0);
  73. activeKeyRef.value = path;
  74. goTo && replace ? router.replace : router.push(path);
  75. },
  76. activeKeyRef,
  77. };
  78. }