index.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <script setup lang="ts">
  2. import { computed } from 'vue'
  3. import { useRoute, useRouter } from 'vue-router'
  4. import { ArrowLeft } from '@element-plus/icons-vue'
  5. const route = useRoute()
  6. const router = useRouter()
  7. interface BreadcrumbItem {
  8. title: string
  9. path?: string
  10. isCurrent?: boolean
  11. }
  12. const breadcrumbs = computed<BreadcrumbItem[]>(() => {
  13. const matched = route.matched.filter(item => item.meta?.title && !item.meta?.hidden)
  14. return matched.map((item, index) => ({
  15. title: item.meta?.title as string,
  16. path: item.path,
  17. isCurrent: index === matched.length - 1
  18. }))
  19. })
  20. const canGoBack = computed(() => {
  21. return window.history.length > 1
  22. })
  23. function goBack() {
  24. router.back()
  25. }
  26. function handleClick(item: BreadcrumbItem) {
  27. if (item.isCurrent || !item.path) return
  28. router.push(item.path)
  29. }
  30. </script>
  31. <template>
  32. <div class="breadcrumb-wrapper">
  33. <!-- <el-button v-if="canGoBack" class="back-btn" :icon="ArrowLeft" circle size="small" @click="goBack" /> -->
  34. <el-breadcrumb separator="/">
  35. <el-breadcrumb-item v-for="item in breadcrumbs" :key="item.path"
  36. :class="{ 'is-clickable': !item.isCurrent && item.path }" @click="handleClick(item)">
  37. <span :class="{ 'current-title': item.isCurrent }">
  38. {{ item.title }}
  39. </span>
  40. </el-breadcrumb-item>
  41. </el-breadcrumb>
  42. </div>
  43. </template>
  44. <style scoped lang="scss">
  45. .breadcrumb-wrapper {
  46. display: flex;
  47. align-items: center;
  48. gap: 12px;
  49. margin-bottom: 20px;
  50. }
  51. .back-btn {
  52. border: none;
  53. background: transparent;
  54. color: var(--admin-text-secondary);
  55. &:hover {
  56. background: rgba(255, 255, 255, 0.1);
  57. color: var(--admin-text-primary);
  58. }
  59. }
  60. :deep(.el-breadcrumb) {
  61. font-size: 14px;
  62. .el-breadcrumb__item {
  63. .el-breadcrumb__inner {
  64. color: var(--admin-text-secondary);
  65. }
  66. &.is-clickable {
  67. .el-breadcrumb__inner {
  68. cursor: pointer;
  69. transition: color 0.2s;
  70. &:hover {
  71. color: var(--el-color-primary);
  72. }
  73. }
  74. }
  75. &:last-child {
  76. .el-breadcrumb__inner {
  77. color: var(--admin-text-primary);
  78. }
  79. }
  80. }
  81. .el-breadcrumb__separator {
  82. color: var(--admin-text-secondary);
  83. }
  84. }
  85. .current-title {
  86. font-weight: 500;
  87. }
  88. </style>