index.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <el-breadcrumb class="h-[50px] flex items-center">
  3. <transition-group name="breadcrumb-transition">
  4. <el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="item.path">
  5. <span v-if="item.redirect === 'noredirect' || index === breadcrumbs.length - 1" class="text-[var(--el-disabled-text-color)]">
  6. {{ translateRouteTitle(item.meta.title) }}
  7. </span>
  8. <a v-else @click.prevent="handleLink(item)">
  9. {{ translateRouteTitle(item.meta.title) }}
  10. </a>
  11. </el-breadcrumb-item>
  12. </transition-group>
  13. </el-breadcrumb>
  14. </template>
  15. <script setup>
  16. import { onBeforeMount, ref, watch } from 'vue'
  17. import { useRoute } from 'vue-router'
  18. import { compile } from 'path-to-regexp'
  19. import { translateRouteTitle } from '@/utils/i18n'
  20. import router from '@/router'
  21. const currentRoute = useRoute()
  22. const pathCompile = (path) => {
  23. const { params } = currentRoute
  24. const toPath = compile(path)
  25. return toPath(params)
  26. }
  27. const breadcrumbs = ref([])
  28. function getBreadcrumb() {
  29. let matched = currentRoute.matched.filter((item) => item.meta && item.meta.title)
  30. const first = matched[0]
  31. if (!isDashboard(first)) {
  32. matched = [{ path: '/', meta: { title: 'home' } }].concat(matched)
  33. }
  34. breadcrumbs.value = matched.filter((item) => {
  35. return item.meta && item.meta.title && item.meta.breadcrumb !== false
  36. })
  37. }
  38. function isDashboard(route) {
  39. const name = route && route.name
  40. if (!name) {
  41. return false
  42. }
  43. return name.toString().trim().toLocaleLowerCase() === 'home'.toLocaleLowerCase()
  44. }
  45. function handleLink(item) {
  46. const { redirect, path, meta } = item
  47. if (meta.type == '0') return
  48. if (redirect) {
  49. router.push(redirect).catch((err) => {
  50. console.warn(err)
  51. })
  52. return
  53. }
  54. router.push(pathCompile(path)).catch((err) => {
  55. console.warn(err)
  56. })
  57. }
  58. watch(
  59. () => currentRoute.path,
  60. (path) => {
  61. if (path.startsWith('/redirect/')) {
  62. return
  63. }
  64. getBreadcrumb()
  65. }
  66. )
  67. onBeforeMount(() => {
  68. getBreadcrumb()
  69. })
  70. </script>
  71. <style lang="scss" scoped>
  72. .app-breadcrumb.el-breadcrumb {
  73. display: inline-block;
  74. margin-left: 8px;
  75. font-size: 14px;
  76. line-height: 50px;
  77. }
  78. // 覆盖 element-plus 的样式
  79. .el-breadcrumb__inner,
  80. .el-breadcrumb__inner a {
  81. font-weight: 400 !important;
  82. }
  83. </style>