index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div class="cip-main-breadcrumb">
  3. <BackButton @click="lBack" class="cip-main-breadcrumb__back" v-if="lCanBack"/>
  4. <el-breadcrumb v-if="routeMatched.length>0">
  5. <template v-for="(item,index) in routeMatched" :key="item.name">
  6. <!-- :to="item.router" @click.prevent="runRouter(item)"-->
  7. <el-breadcrumb-item >
  8. <template v-if="item.router && index!==routeMatched.length-1">
  9. <span class="cip-main-breadcrumb--link" @click.prevent="runRouter(item)">{{getRouteName(item)}}</span>
  10. </template>
  11. <template v-else>
  12. {{getRouteName(item)}}
  13. </template>
  14. </el-breadcrumb-item>
  15. </template>
  16. </el-breadcrumb>
  17. </div>
  18. </template>
  19. <script>
  20. import { computed, inject } from 'vue'
  21. import { useRoute, useRouter } from 'vue-router'
  22. import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus'
  23. import { depthFirstSearchTree, getUsingConfig, isNotEmpty } from '@cip/utils/util'
  24. import { getMenuTitle, isHideInMenu } from '../helper'
  25. import BackButton from '../../page-layout/widgets/back-button'
  26. export default {
  27. props: {
  28. navMenu: Array,
  29. menuNameMap: Map,
  30. canBack: { type: Boolean, default: undefined },
  31. back: Function
  32. },
  33. components: {
  34. ElBreadcrumb, ElBreadcrumbItem, BackButton
  35. },
  36. setup (props, { emit }) {
  37. const cipMenu = inject('cip-menu', {})
  38. const _navMenu = computed(() => {
  39. return getUsingConfig(props.navMenu, cipMenu.navMenu)
  40. })
  41. const _menuNameMap = computed(() => {
  42. return getUsingConfig(props.menuNameMap, cipMenu.menuNameMap)
  43. })
  44. const route = useRoute()
  45. const router = useRouter()
  46. const routeMatched = computed(() => {
  47. const loop = _navMenu.value?.length ?? 0
  48. for (let i = 0; i < loop; i++) {
  49. const result = depthFirstSearchTree(_navMenu.value[i], route.name, 'name')
  50. if (result) {
  51. return result
  52. }
  53. }
  54. return []
  55. })
  56. const getRouteName = (item) => {
  57. return _menuNameMap.value.get(item.name) ? getMenuTitle(item) + '-' + _menuNameMap.value.get(item.name) : getMenuTitle(item)
  58. }
  59. const lCanBack = computed(() => {
  60. if (isNotEmpty(props.canBack)) return props.canBack
  61. if (routeMatched.value) {
  62. const lastRoute = routeMatched.value[routeMatched.value.length - 1]
  63. return isHideInMenu(lastRoute) // hideRoute 需要back
  64. } else {
  65. return false
  66. }
  67. })
  68. const runRouter = (item) => {
  69. if (item.router) {
  70. if (typeof item.router === 'function') {
  71. item.router(router, route)
  72. } else {
  73. router.replace(item.router === true ? { name: item.name } : item.router)
  74. }
  75. }
  76. }
  77. const lBack = () => {
  78. if (props.back) {
  79. props.back()
  80. } else {
  81. for (let i = 0; i < routeMatched.value.length; i++) {
  82. const route = routeMatched.value[routeMatched.value.length - 1 - i]
  83. if (!isHideInMenu(route)) {
  84. if (route.router) {
  85. runRouter(route)
  86. } else {
  87. router.replace(route)
  88. }
  89. return // 不继续执行
  90. }
  91. }
  92. // 没有找到true就go(-1)
  93. router.back()
  94. }
  95. // 直接在此处处理
  96. }
  97. return { routeMatched, runRouter, getRouteName, lCanBack, lBack }
  98. }
  99. }
  100. </script>
  101. <style lang="less">
  102. .cip-main-breadcrumb{
  103. display: flex;
  104. align-items: center;
  105. padding:4px 20px;
  106. &__back{
  107. margin-right: 8px;
  108. }
  109. &--link{
  110. cursor: pointer;
  111. color: #303133;
  112. font-weight: bold;
  113. &:hover{
  114. color: @primary;
  115. }
  116. }
  117. }
  118. </style>