tabbar.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 { 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 tabbarStore = useTabbarStore();
  15. const { contentIsMaximize, 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. const tab = tabbarStore.getTabByPath(currentActive.value);
  26. const menus = createContextMenus(tab);
  27. return menus.map((item) => {
  28. return {
  29. ...item,
  30. label: item.text,
  31. value: item.key,
  32. };
  33. });
  34. });
  35. // 刷新后如果不保持tab状态,关闭其他tab
  36. if (!preferences.tabbar.persist) {
  37. tabbarStore.closeOtherTabs(route);
  38. }
  39. </script>
  40. <template>
  41. <TabsView
  42. :active="currentActive"
  43. :class="theme"
  44. :context-menus="createContextMenus"
  45. :dragable="preferences.tabbar.dragable"
  46. :show-icon="showIcon"
  47. :style-type="preferences.tabbar.styleType"
  48. :tabs="currentTabs"
  49. @close="handleClose"
  50. @sort-tabs="tabbarStore.sortTabs"
  51. @unpin="unpinTab"
  52. @update:active="handleClick"
  53. />
  54. <div class="flex-center h-full">
  55. <TabsToolMore v-if="preferences.tabbar.showMore" :menus="menus" />
  56. <TabsToolScreen
  57. v-if="preferences.tabbar.showMaximize"
  58. :screen="contentIsMaximize"
  59. @change="toggleMaximize"
  60. @update:screen="toggleMaximize"
  61. />
  62. </div>
  63. </template>