Breadcrumb.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <el-breadcrumb
  3. class="c-breadcrumb"
  4. separator="/"
  5. >
  6. <transition-group name="breadcrumb">
  7. <el-breadcrumb-item
  8. v-for="(item, index) in levelList"
  9. :key="item.path"
  10. >
  11. <span
  12. v-if="index === levelList.length - 1"
  13. class="last"
  14. >
  15. {{ item.meta.title }}
  16. </span>
  17. <span
  18. v-else-if="index === 0"
  19. class="placeholder"
  20. >
  21. {{ item.meta.title }}
  22. </span>
  23. <a
  24. v-else
  25. @click.prevent="handleLink(item)"
  26. >
  27. {{ item.meta.title }}
  28. </a>
  29. </el-breadcrumb-item>
  30. </transition-group>
  31. </el-breadcrumb>
  32. </template>
  33. <script>
  34. import { compile } from 'path-to-regexp'
  35. export default {
  36. name: 'Breadcrumb',
  37. computed: {
  38. levelList () {
  39. return this.$route.matched.filter(item => item.meta?.title)
  40. }
  41. },
  42. methods: {
  43. handleLink (item) {
  44. const { redirect, name, path } = item
  45. if (redirect) {
  46. this.$router.push(redirect)
  47. return
  48. }
  49. if (name) {
  50. this.$router.push({
  51. name,
  52. params: { ...this.$route.params }
  53. })
  54. return
  55. }
  56. this.$router.push(compile(path)(this.$route.params))
  57. }
  58. }
  59. }
  60. </script>
  61. <style lang="scss" scoped>
  62. .breadcrumb-enter-active,
  63. .breadcrumb-leave-active {
  64. transition: all 0.5s;
  65. }
  66. .breadcrumb-enter,
  67. .breadcrumb-leave-active {
  68. opacity: 0;
  69. transform: translateX(20px);
  70. }
  71. .breadcrumb-move {
  72. transition: all 0.5s;
  73. }
  74. .breadcrumb-leave-active {
  75. position: absolute;
  76. }
  77. .c-breadcrumb {
  78. display: inline-block;
  79. font-size: 14px;
  80. line-height: 50px;
  81. user-select: none;
  82. .last {
  83. color: #97a8be;
  84. cursor: auto;
  85. }
  86. .placeholder {
  87. font-weight: 700;
  88. }
  89. }
  90. </style>