刘光辉
10 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
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
76
<script lang="ts" setup>
import type { BreadcrumbProps } from './types';
 
import { ChevronDown } from '@vben-core/icons';
 
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from '../../ui';
import { VbenIcon } from '../icon';
 
interface Props extends BreadcrumbProps {}
 
defineOptions({ name: 'Breadcrumb' });
withDefaults(defineProps<Props>(), {
  showIcon: false,
});
 
const emit = defineEmits<{ select: [string] }>();
 
function handleClick(path?: string) {
  if (!path) {
    return;
  }
  emit('select', path);
}
</script>
<template>
  <Breadcrumb>
    <BreadcrumbList>
      <TransitionGroup name="breadcrumb-transition">
        <template v-for="(item, index) in breadcrumbs" :key="`${item.path}-${item.title}-${index}`">
          <BreadcrumbItem>
            <div v-if="item.items?.length ?? 0 > 0">
              <DropdownMenu>
                <DropdownMenuTrigger class="flex items-center gap-1">
                  <VbenIcon v-if="showIcon" :icon="item.icon" class="size-5" />
                  {{ item.title }}
                  <ChevronDown class="size-4" />
                </DropdownMenuTrigger>
                <DropdownMenuContent align="start">
                  <template v-for="menuItem in item.items" :key="`sub-${menuItem.path}`">
                    <DropdownMenuItem @click.stop="handleClick(menuItem.path)">
                      {{ menuItem.title }}
                    </DropdownMenuItem>
                  </template>
                </DropdownMenuContent>
              </DropdownMenu>
            </div>
            <BreadcrumbLink v-else-if="index !== breadcrumbs.length - 1" href="javascript:void 0" @click.stop="handleClick(item.path)">
              <div class="flex-center">
                <VbenIcon v-if="showIcon" :class="{ 'size-5': item.isHome }" :icon="item.icon" class="size-5" />
                {{ item.title }}
              </div>
            </BreadcrumbLink>
            <BreadcrumbPage v-else>
              <div class="flex-center">
                <VbenIcon v-if="showIcon" :class="{ 'size-5': item.isHome }" :icon="item.icon" class="size-5" />
                {{ item.title }}
              </div>
            </BreadcrumbPage>
            <BreadcrumbSeparator v-if="index < breadcrumbs.length - 1 && !item.isHome" />
          </BreadcrumbItem>
        </template>
      </TransitionGroup>
    </BreadcrumbList>
  </Breadcrumb>
</template>