Blame view

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