use-tabs.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { type RouteLocationNormalized, useRoute, useRouter } from 'vue-router';
  2. import { useTabbarStore } from '@vben/stores';
  3. export function useTabs() {
  4. const router = useRouter();
  5. const route = useRoute();
  6. const tabbarStore = useTabbarStore();
  7. async function closeLeftTabs(tab?: RouteLocationNormalized) {
  8. await tabbarStore.closeLeftTabs(tab || route);
  9. }
  10. async function closeAllTabs() {
  11. await tabbarStore.closeAllTabs(router);
  12. }
  13. async function closeRightTabs(tab?: RouteLocationNormalized) {
  14. await tabbarStore.closeRightTabs(tab || route);
  15. }
  16. async function closeOtherTabs(tab?: RouteLocationNormalized) {
  17. await tabbarStore.closeOtherTabs(tab || route);
  18. }
  19. async function closeCurrentTab(tab?: RouteLocationNormalized) {
  20. await tabbarStore.closeTab(tab || route, router);
  21. }
  22. async function pinTab(tab?: RouteLocationNormalized) {
  23. await tabbarStore.pinTab(tab || route);
  24. }
  25. async function unpinTab(tab?: RouteLocationNormalized) {
  26. await tabbarStore.unpinTab(tab || route);
  27. }
  28. async function toggleTabPin(tab?: RouteLocationNormalized) {
  29. await tabbarStore.toggleTabPin(tab || route);
  30. }
  31. async function refreshTab() {
  32. await tabbarStore.refresh(router);
  33. }
  34. async function openTabInNewWindow(tab?: RouteLocationNormalized) {
  35. await tabbarStore.openTabInNewWindow(tab || route);
  36. }
  37. async function closeTabByKey(key: string) {
  38. await tabbarStore.closeTabByKey(key, router);
  39. }
  40. async function setTabTitle(title: string) {
  41. tabbarStore.setUpdateTime();
  42. await tabbarStore.setTabTitle(route, title);
  43. }
  44. async function resetTabTitle() {
  45. tabbarStore.setUpdateTime();
  46. await tabbarStore.resetTabTitle(route);
  47. }
  48. /**
  49. * 获取操作是否禁用
  50. * @param tab
  51. */
  52. function getTabDisableState(tab: RouteLocationNormalized = route) {
  53. const tabs = tabbarStore.getTabs;
  54. const affixTabs = tabbarStore.affixTabs;
  55. const index = tabs.findIndex((item) => item.path === tab.path);
  56. const disabled = tabs.length <= 1;
  57. const { meta } = tab;
  58. const affixTab = meta?.affixTab ?? false;
  59. const isCurrentTab = route.path === tab.path;
  60. // 当前处于最左侧或者减去固定标签页的数量等于0
  61. const disabledCloseLeft =
  62. index === 0 || index - affixTabs.length <= 0 || !isCurrentTab;
  63. const disabledCloseRight = !isCurrentTab || index === tabs.length - 1;
  64. const disabledCloseOther =
  65. disabled || !isCurrentTab || tabs.length - affixTabs.length <= 1;
  66. return {
  67. disabledCloseAll: disabled,
  68. disabledCloseCurrent: !!affixTab || disabled,
  69. disabledCloseLeft,
  70. disabledCloseOther,
  71. disabledCloseRight,
  72. disabledRefresh: !isCurrentTab,
  73. };
  74. }
  75. return {
  76. closeAllTabs,
  77. closeCurrentTab,
  78. closeLeftTabs,
  79. closeOtherTabs,
  80. closeRightTabs,
  81. closeTabByKey,
  82. getTabDisableState,
  83. openTabInNewWindow,
  84. pinTab,
  85. refreshTab,
  86. resetTabTitle,
  87. setTabTitle,
  88. toggleTabPin,
  89. unpinTab,
  90. };
  91. }