2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 13:47:15 +08:00
Files
panel/web/src/layout/header/components/BreadCrumb.vue
2024-10-10 00:17:04 +08:00

64 lines
1.7 KiB
Vue

<script lang="ts" setup>
import { renderIcon } from '@/utils'
import { useI18n } from 'vue-i18n'
import type { Meta } from '~/types/router'
const { t } = useI18n()
const router = useRouter()
const route = useRoute()
const generator: any = (routerMap: any) => {
return routerMap.map((item: any) => {
const currentMenu = {
...item,
label: t(String(item.meta.title)),
key: item.path,
disabled: item.path === '/',
icon: getIcon(item.meta)
}
// 是否有子菜单,并递归处理
if (item.children && item.children.length > 0) {
currentMenu.children = generator(item.children, currentMenu)
}
return currentMenu
})
}
const breadcrumbList = computed(() => {
return generator(route.matched)
})
function handleBreadClick(path: string) {
if (path === route.path) return
router.push(path)
}
function getIcon(meta?: Meta, size = 16) {
if (meta?.icon) return renderIcon(meta.icon, { size })
return ''
}
</script>
<template>
<n-breadcrumb>
<template v-for="routeItem in breadcrumbList" :key="routeItem.name">
<n-breadcrumb-item v-if="routeItem.meta.title">
<n-dropdown
v-if="routeItem.children.length"
:options="routeItem.children"
@select="handleBreadClick"
>
<span class="link-text">
<component :is="routeItem.icon" v-if="routeItem.icon" />
{{ $t(routeItem.meta.title) }}
</span>
</n-dropdown>
<span v-else class="link-text">
<component :is="routeItem.icon" v-if="routeItem.icon" />
{{ $t(routeItem.meta.title) }}
</span>
</n-breadcrumb-item>
</template>
</n-breadcrumb>
</template>