Breadcrumb.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <script setup lang="ts">
  2. import { computed } from 'vue'
  3. import { icons } from '@/utils/common'
  4. import { ArrowRight } from '@element-plus/icons-vue'
  5. import { useRoute, useRouter } from 'vue-router'
  6. const route = useRoute()
  7. const router = useRouter()
  8. const breadcrumbList: any = computed(() => {
  9. return route.matched
  10. })
  11. console.log(breadcrumbList)
  12. const isUnicode = (val: string | undefined) => {
  13. if (!val) return false
  14. return !/ue/g.test(val)
  15. }
  16. const onBreadcrumbClick = (item: any, index: number) => {
  17. if (index !== breadcrumbList.value.length - 1) router.push(item.path)
  18. }
  19. </script>
  20. <template>
  21. <div class="breadcrumb-box">
  22. <el-breadcrumb :separator-icon="ArrowRight">
  23. <transition-group appear name="breadcrumb">
  24. <el-breadcrumb-item v-for="(item, index) in breadcrumbList" :key="item.path">
  25. <div class="el-breadcrumb__inner is-link" @click="onBreadcrumbClick(item, index)">
  26. <el-icon class="breadcrumb-icon" v-if="isUnicode(item.meta.icon as string)">
  27. <component :is="item.meta.icon"></component>
  28. </el-icon>
  29. <i v-else class="iconfont el-icon breadcrumb-icon">{{ icons[item.meta.icon] }}</i>
  30. <span class="breadcrumb-title">{{ item.meta.title }}</span>
  31. </div>
  32. </el-breadcrumb-item>
  33. </transition-group>
  34. </el-breadcrumb>
  35. </div>
  36. </template>
  37. <style scoped lang="scss">
  38. .breadcrumb-box {
  39. display: flex;
  40. align-items: center;
  41. padding-right: 50px;
  42. overflow: hidden;
  43. mask-image: linear-gradient(90deg, #000000 0%, #000000 calc(100% - 50px), transparent);
  44. color: #fff;
  45. .iconfont {
  46. width: 16px;
  47. color: #fff;
  48. }
  49. .el-breadcrumb {
  50. white-space: nowrap;
  51. .el-breadcrumb__item {
  52. position: relative;
  53. display: inline-block;
  54. float: none;
  55. .el-breadcrumb__inner {
  56. display: inline-flex;
  57. color: #fff;
  58. .breadcrumb-icon {
  59. margin-right: 6px;
  60. font-size: 16px;
  61. }
  62. }
  63. :deep(.el-breadcrumb__separator) {
  64. position: relative;
  65. }
  66. }
  67. }
  68. }
  69. .no-icon {
  70. .el-breadcrumb {
  71. .el-breadcrumb__item {
  72. top: -2px;
  73. :deep(.el-breadcrumb__separator) {
  74. top: 2px;
  75. }
  76. }
  77. }
  78. }
  79. </style>