tabbar.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <script lang="ts" setup>
  2. import { computed } from 'vue';
  3. import { useRoute } from 'vue-router';
  4. import { useContentMaximize, useTabs } from '@vben-core/hooks';
  5. import { preferences } from '@vben-core/preferences';
  6. import { useCoreTabbarStore } from '@vben-core/stores';
  7. import { TabsToolMore, TabsToolScreen, TabsView } from '@vben-core/tabs-ui';
  8. import { useTabbar } from './use-tabbar';
  9. defineOptions({
  10. name: 'LayoutTabbar',
  11. });
  12. defineProps<{ showIcon?: boolean; theme?: string }>();
  13. const route = useRoute();
  14. const coreTabbarStore = useCoreTabbarStore();
  15. const { toggleMaximize } = useContentMaximize();
  16. const { unpinTab } = useTabs();
  17. const {
  18. createContextMenus,
  19. currentActive,
  20. currentTabs,
  21. handleClick,
  22. handleClose,
  23. } = useTabbar();
  24. const menus = computed(() => {
  25. return createContextMenus(route);
  26. });
  27. // 刷新后如果不保持tab状态,关闭其他tab
  28. if (!preferences.tabbar.persist) {
  29. coreTabbarStore.closeOtherTabs(route);
  30. }
  31. </script>
  32. <template>
  33. <TabsView
  34. :active="currentActive"
  35. :class="theme"
  36. :context-menus="createContextMenus"
  37. :dragable="preferences.tabbar.dragable"
  38. :show-icon="showIcon"
  39. :style-type="preferences.tabbar.styleType"
  40. :tabs="currentTabs"
  41. @close="handleClose"
  42. @sort-tabs="coreTabbarStore.sortTabs"
  43. @unpin="unpinTab"
  44. @update:active="handleClick"
  45. />
  46. <div class="flex-center h-full">
  47. <TabsToolMore :menus="menus" />
  48. <TabsToolScreen
  49. :screen="preferences.sidebar.hidden"
  50. @change="toggleMaximize"
  51. @update:screen="toggleMaximize"
  52. />
  53. </div>
  54. </template>