Breadcrumb.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. import { GlobalStore } from '@/stores/index'
  7. const route = useRoute()
  8. const router = useRouter()
  9. const globalStore = GlobalStore()
  10. const breadcrumbList: any = computed(() => {
  11. const { path, name } = route
  12. const BreadcrumbList = getExtraBreadcrumb(name as string)
  13. if (BreadcrumbList) return BreadcrumbList
  14. return globalStore.GET_AllBreadcrumbList[path]
  15. })
  16. // console.log(globalStore.GET_AllBreadcrumbList)
  17. /**
  18. * 获取额外的面包屑
  19. * @param name 路由名称
  20. */
  21. const getExtraBreadcrumb = (name: string) => {
  22. switch (name) {
  23. case 'ContractDetail':
  24. return getBreadcrumb('/contractDetail', 'ue628', '/contract')
  25. case 'InStorageDetail':
  26. return getBreadcrumb('/inStorageDetail', 'ue60f', '/inStorage')
  27. case 'ReceiveOutStock':
  28. return getBreadcrumb('/receiveOutStock', 'ue7ec', '/outStock')
  29. case 'SaleOutStock':
  30. return getBreadcrumb('/saleOutStock', 'ue7e8', '/outStock')
  31. case 'OutStockDetail':
  32. return getBreadcrumb('/outStockDetail', 'ue72c', '/outStock')
  33. case 'VerifyContractDetail':
  34. return getBreadcrumb('/verifyContractDetail', 'ue679', '/verifyContract')
  35. }
  36. }
  37. /**
  38. * 获取面包屑
  39. */
  40. const getBreadcrumb = (path: string, icon: string, view: string) => {
  41. const routerList = [...globalStore.GET_AllBreadcrumbList[view]]
  42. routerList.push({ meta: { ...route.meta, icon }, path })
  43. return routerList
  44. }
  45. const isUnicode = (val: string | undefined) => {
  46. if (!val) return false
  47. return !/ue/g.test(val)
  48. }
  49. const onBreadcrumbClick = (item: any, index: number) => {
  50. if (item.meta.routerView) return
  51. if (index !== breadcrumbList.value.length - 1) router.push(item.path)
  52. }
  53. </script>
  54. <template>
  55. <div class="breadcrumb-box">
  56. <el-breadcrumb :separator-icon="ArrowRight">
  57. <!-- animate__slideInUp -->
  58. <transition-group
  59. appear
  60. leave-active-class="animate__animated animate__slideInUp"
  61. enter-active-class="animate__animated animate__slideInDown"
  62. >
  63. <el-breadcrumb-item
  64. v-for="(item, index) in breadcrumbList"
  65. :key="item.path"
  66. :class="{ cursor: item.meta.routerView }"
  67. >
  68. <div class="el-breadcrumb__inner is-link" @click="onBreadcrumbClick(item, index)">
  69. <el-icon class="breadcrumb-icon" v-if="isUnicode(item.meta.icon as string)">
  70. <component :is="item.meta.icon"></component>
  71. </el-icon>
  72. <i v-else class="iconfont el-icon breadcrumb-icon">{{ icons[item.meta.icon] }}</i>
  73. <span class="breadcrumb-title">{{ item.meta.title }}</span>
  74. </div>
  75. </el-breadcrumb-item>
  76. </transition-group>
  77. </el-breadcrumb>
  78. </div>
  79. </template>
  80. <style scoped lang="scss">
  81. .breadcrumb-box {
  82. display: flex;
  83. align-items: center;
  84. padding-right: 50px;
  85. overflow: hidden;
  86. mask-image: linear-gradient(90deg, #000000 0%, #000000 calc(100% - 50px), transparent);
  87. color: #fff;
  88. .iconfont {
  89. width: 16px;
  90. color: #fff;
  91. }
  92. .cursor.el-breadcrumb__item {
  93. cursor: auto;
  94. .el-breadcrumb__inner {
  95. cursor: auto;
  96. .breadcrumb-title {
  97. cursor: auto;
  98. }
  99. }
  100. }
  101. .el-breadcrumb {
  102. white-space: nowrap;
  103. .el-breadcrumb__item {
  104. position: relative;
  105. display: inline-block;
  106. float: none;
  107. .el-breadcrumb__inner {
  108. display: inline-flex;
  109. color: #fff;
  110. .breadcrumb-icon {
  111. margin-right: 6px;
  112. font-size: 16px;
  113. }
  114. }
  115. :deep(.el-breadcrumb__separator) {
  116. position: relative;
  117. }
  118. }
  119. }
  120. }
  121. .no-icon {
  122. .el-breadcrumb {
  123. .el-breadcrumb__item {
  124. top: -2px;
  125. :deep(.el-breadcrumb__separator) {
  126. top: 2px;
  127. }
  128. }
  129. }
  130. }
  131. </style>