tabbar.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <script lang="ts" setup>
  2. import { computed } from 'vue';
  3. import { useRoute } from 'vue-router';
  4. import { useContentMaximize, useTabs } from '@vben/hooks';
  5. import { preferences } from '@vben/preferences';
  6. import { useTabbarStore } from '@vben/stores';
  7. import {
  8. TabsToolMore,
  9. TabsToolRefresh,
  10. TabsToolScreen,
  11. TabsView,
  12. } from '@vben-core/tabs-ui';
  13. import { useTabbar } from './use-tabbar';
  14. defineOptions({
  15. name: 'LayoutTabbar',
  16. });
  17. defineProps<{ showIcon?: boolean; theme?: string }>();
  18. const route = useRoute();
  19. const tabbarStore = useTabbarStore();
  20. const { contentIsMaximize, toggleMaximize } = useContentMaximize();
  21. const { refreshTab, unpinTab } = useTabs();
  22. const {
  23. createContextMenus,
  24. currentActive,
  25. currentTabs,
  26. handleClick,
  27. handleClose,
  28. } = useTabbar();
  29. const menus = computed(() => {
  30. const tab = tabbarStore.getTabByKey(currentActive.value);
  31. const menus = createContextMenus(tab);
  32. return menus.map((item) => {
  33. return {
  34. ...item,
  35. label: item.text,
  36. value: item.key,
  37. };
  38. });
  39. });
  40. // 刷新后如果不保持tab状态,关闭其他tab
  41. if (!preferences.tabbar.persist) {
  42. tabbarStore.closeOtherTabs(route);
  43. }
  44. </script>
  45. <template>
  46. <TabsView
  47. :active="currentActive"
  48. :class="theme"
  49. :context-menus="createContextMenus"
  50. :draggable="preferences.tabbar.draggable"
  51. :show-icon="showIcon"
  52. :style-type="preferences.tabbar.styleType"
  53. :tabs="currentTabs"
  54. :wheelable="preferences.tabbar.wheelable"
  55. :middle-click-to-close="preferences.tabbar.middleClickToClose"
  56. @close="handleClose"
  57. @sort-tabs="tabbarStore.sortTabs"
  58. @unpin="unpinTab"
  59. @update:active="handleClick"
  60. />
  61. <div class="flex-center h-full">
  62. <TabsToolMore v-if="preferences.tabbar.showMore" :menus="menus" />
  63. <TabsToolRefresh
  64. v-if="preferences.tabbar.showRefresh"
  65. @refresh="refreshTab"
  66. />
  67. <TabsToolScreen
  68. v-if="preferences.tabbar.showMaximize"
  69. :screen="contentIsMaximize"
  70. @change="toggleMaximize"
  71. @update:screen="toggleMaximize"
  72. />
  73. </div>
  74. </template>