use-tabs.ts 3.0 KB

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