1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- <template>
- <el-breadcrumb class="h-[50px] flex items-center">
- <transition-group name="breadcrumb-transition">
- <el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.path">
- <span v-if="item.redirect === 'noredirect' || index === breadcrumbs.length - 1" class="text-[var(--el-disabled-text-color)]">
- {{ translateRouteTitle(item.meta.title) }}
- </span>
- <a v-else @click.prevent="handleLink(item)">
- {{ translateRouteTitle(item.meta.title) }}
- </a>
- </el-breadcrumb-item>
- </transition-group>
- </el-breadcrumb>
- </template>
- <script setup>
- import { onBeforeMount, ref, watch } from 'vue'
- import { useRoute } from 'vue-router'
- import { compile } from 'path-to-regexp'
- import { translateRouteTitle } from '@/utils/i18n'
- import router from '@/router'
- const currentRoute = useRoute()
- const pathCompile = (path) => {
- const { params } = currentRoute
- const toPath = compile(path)
- return toPath(params)
- }
- const breadcrumbs = ref([])
- function getBreadcrumb() {
- let matched = currentRoute.matched.filter((item) => item.meta && item.meta.title)
- const first = matched[0]
- if (!isDashboard(first)) {
- matched = [{ path: '/', meta: { title: 'home' } }].concat(matched)
- }
- breadcrumbs.value = matched.filter((item) => {
- return item.meta && item.meta.title && item.meta.breadcrumb !== false
- })
- }
- function isDashboard(route) {
- const name = route && route.name
- if (!name) {
- return false
- }
- return name.toString().trim().toLocaleLowerCase() === 'home'.toLocaleLowerCase()
- }
- function handleLink(item) {
- const { redirect, path, meta } = item
- if (meta.type == '0') return
- if (redirect) {
- router.push(redirect).catch((err) => {
- console.warn(err)
- })
- return
- }
- router.push(pathCompile(path)).catch((err) => {
- console.warn(err)
- })
- }
- watch(
- () => currentRoute.path,
- (path) => {
- if (path.startsWith('/redirect/')) {
- return
- }
- getBreadcrumb()
- }
- )
- onBeforeMount(() => {
- getBreadcrumb()
- })
- </script>
- <style lang="scss" scoped>
- .app-breadcrumb.el-breadcrumb {
- display: inline-block;
- margin-left: 8px;
- font-size: 14px;
- line-height: 50px;
- }
- // 覆盖 element-plus 的样式
- .el-breadcrumb__inner,
- .el-breadcrumb__inner a {
- font-weight: 400 !important;
- }
- </style>
|