| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- <template>
- <a-dropdown trigger="contextMenu" :popup-max-height="false" @select="actionSelect">
- <span class="arco-tag arco-tag-size-medium arco-tag-checked"
- :class="{ 'link-activated': itemData.fullPath === $route.fullPath }" @click="goto(itemData)">
- <span class="tag-link">
- {{ $t(itemData.title) }}
- </span>
- <span class="arco-icon-hover arco-tag-icon-hover arco-icon-hover-size-medium arco-tag-close-btn"
- @click.stop="tagClose(itemData, index)">
- <icon-close />
- </span>
- </span>
- <template #content>
- <a-doption :disabled="disabledReload" :value="Eaction.reload">
- <icon-refresh />
- <span>重新加载</span>
- </a-doption>
- <a-doption class="sperate-line" :disabled="disabledCurrent" :value="Eaction.current">
- <icon-close />
- <span>关闭当前标签页</span>
- </a-doption>
- <a-doption :disabled="disabledLeft" :value="Eaction.left">
- <icon-to-left />
- <span>关闭左侧标签页</span>
- </a-doption>
- <a-doption class="sperate-line" :disabled="disabledRight" :value="Eaction.right">
- <icon-to-right />
- <span>关闭右侧标签页</span>
- </a-doption>
- <a-doption :value="Eaction.others">
- <icon-swap />
- <span>关闭其它标签页</span>
- </a-doption>
- <a-doption :value="Eaction.all">
- <icon-folder-delete />
- <span>关闭全部标签页</span>
- </a-doption>
- </template>
- </a-dropdown>
- </template>
- <script lang="ts" setup>
- import { PropType, computed } from 'vue';
- import { useRouter, useRoute } from 'vue-router';
- import { useTabBarStore } from '@/store';
- import type { TagProps } from '@/store/modules/tab-bar/types';
- import { DEFAULT_ROUTE_NAME, REDIRECT_ROUTE_NAME } from '@/router/constants';
- // eslint-disable-next-line no-shadow
- enum Eaction {
- reload = 'reload',
- current = 'current',
- left = 'left',
- right = 'right',
- others = 'others',
- all = 'all',
- }
- const props = defineProps({
- itemData: {
- type: Object as PropType<TagProps>,
- default: () => ({})
- },
- index: {
- type: Number,
- default: 0,
- },
- });
- const router = useRouter();
- const route = useRoute();
- const tabBarStore = useTabBarStore();
- const goto = (tag: TagProps) => {
- router.push({ ...tag });
- };
- const tagList = computed(() => {
- return tabBarStore.getTabList;
- });
- const disabledReload = computed(() => {
- return props.itemData.fullPath !== route.fullPath;
- });
- const disabledCurrent = computed(() => {
- return props.index === 0;
- });
- const disabledLeft = computed(() => {
- return [0, 1].includes(props.index);
- });
- const disabledRight = computed(() => {
- return props.index === tagList.value.length - 1;
- });
- const tagClose = (tag: TagProps, idx: number) => {
- tabBarStore.deleteTag(idx, tag);
- if (props.itemData.fullPath === route.fullPath) {
- const latest = tagList.value[idx - 1]; // 获取队列的前一个tab
- router.push({ name: latest.name });
- }
- };
- const findCurrentRouteIndex = () => {
- return tagList.value.findIndex((el) => el.fullPath === route.fullPath);
- };
- const actionSelect = async (value: any) => {
- const { itemData, index } = props;
- const copyTagList = [...tagList.value];
- if (value === Eaction.current) {
- tagClose(itemData, index);
- } else if (value === Eaction.left) {
- const currentRouteIdx = findCurrentRouteIndex();
- copyTagList.splice(1, props.index - 1);
- tabBarStore.freshTabList(copyTagList);
- if (currentRouteIdx < index) {
- router.push({ name: itemData.name });
- }
- } else if (value === Eaction.right) {
- const currentRouteIdx = findCurrentRouteIndex();
- copyTagList.splice(props.index + 1);
- tabBarStore.freshTabList(copyTagList);
- if (currentRouteIdx > index) {
- router.push({ name: itemData.name });
- }
- } else if (value === Eaction.others) {
- const filterList = tagList.value.filter((el, idx) => {
- return idx === 0 || idx === props.index;
- });
- tabBarStore.freshTabList(filterList);
- router.push({ name: itemData.name });
- } else if (value === Eaction.reload) {
- tabBarStore.deleteCache(itemData);
- await router.push({
- name: REDIRECT_ROUTE_NAME,
- params: {
- path: route.fullPath,
- },
- });
- tabBarStore.addCache(itemData.name);
- } else {
- tabBarStore.resetTabList();
- router.push({ name: DEFAULT_ROUTE_NAME });
- }
- };
- </script>
- <style scoped lang="less">
- .tag-link {
- color: var(--color-text-2);
- text-decoration: none;
- }
- .link-activated {
- color: rgb(var(--link-6));
- .tag-link {
- color: rgb(var(--link-6));
- }
- &+.arco-tag-close-btn {
- color: rgb(var(--link-6));
- }
- }
- :deep(.arco-dropdown-option-content) {
- span {
- margin-left: 10px;
- }
- }
- .arco-dropdown-open {
- .tag-link {
- color: rgb(var(--danger-6));
- }
- .arco-tag-close-btn {
- color: rgb(var(--danger-6));
- }
- }
- .sperate-line {
- border-bottom: 1px solid var(--color-neutral-3);
- }
- </style>
|