elementPlus + 动态路由 + 刷新 使用 面包屑

1,259 阅读1分钟

该项目git地址

  • 结合项目源码更容易看懂 代码更完整
  • 这是一整个系列 可以看看之前的文章 能了解数据是怎么封装的

面包屑的实现

  • 使用的是 elementPlus 只需要获取当前或有 并将路由的名称信息显示出来就行了

  • 因为使用的动态路由 还要根据 之前页面刷新保持原来状态不变 所以要顶一个函数查找更新一下

    • 面包屑组件

      • <template>
          <div class="nav-breadcrumb">
            <el-breadcrumb separator="/">
              <template v-for="item in props.breadcrumbs" :key="item.name">
                <el-breadcrumb-item :to="{ path: item.path }">{{
                  item.name
                }}</el-breadcrumb-item>
              </template>
            </el-breadcrumb>
          </div>
        </template><script setup lang="ts">
        import { defineProps, PropType } from 'vue'
        import { IBreadcrumb } from '../types'const props = defineProps({
          breadcrumbs: {
            type: Array as PropType<IBreadcrumb[]>,
            default: () => [],
          },
        })
        </script><style scoped></style>
        
    • 面包屑 父组件

      • <template>
          <div class="nav-header">
            <i class="iconfont icon-menu" @click="handleFoldClick"></i>
            <div class="content">
              <hy-breadcrumb :breadcrumbs="breadcrumbs" />
              <user-info />
            </div>
          </div>
        </template><script setup lang="ts">
        import { defineEmits, ref, computed } from 'vue'import UserInfo from './user-info.vue'
        import HyBreadcrumb from '@/base-ui/breadcrumb'import { useStore } from '@/store'
        import { useRoute } from 'vue-router'
        import { pathMapBreadcrumbs } from '@/utils/map-menus'const emit = defineEmits(['foldChange'])
        const isFold = ref(false)
        const handleFoldClick = () => {
          isFold.value = !isFold.value
          emit('foldChange', isFold.value)
        }
        ​
        // 面包屑的数据: [{name: , path: }]
        const store = useStore()
        // 监听面包屑数据变化 如果改变 就是用工具函数 重新生成
        const breadcrumbs = computed(() => {
          const userMenus = store.state.login.userMenus
          const route = useRoute()
          const currentPath = route.path
          return pathMapBreadcrumbs(userMenus, currentPath)
        })
        </script><style scoped lang="less">
        .nav-header {
          display: flex;
          width: 100%;
        ​
          .icon-menu {
            font-size: 24px;
            cursor: pointer;
          }
        ​
          .content {
            display: flex;
            justify-content: space-between;
            align-items: center;
            flex: 1;
            padding: 0 20px;
          }
        }
        </style>
    • pathMapBreadcrumbs 函数

      • // /main/system/role  -> type === 2 对应menu
        // 收集面包屑的函数
        export function pathMapToMenu(
          userMenus: any[],
          currentPath: string,
          breadcrumbs?: IBreadcrumb[]
        ): any {
          console.log(userMenus, currentPath)
          for (const menu of userMenus) {
            // 1 代表外层 会递归遍历向里面查找
            if (menu.type === 1) {
              // 这里接收深层递归返回的结果
              const findMenu = pathMapToMenu(menu.children ?? [], currentPath)
              // 这里将最终找到的结果返回出去
              if (findMenu) {
                breadcrumbs?.push({ name: menu.name })
                breadcrumbs?.push({ name: findMenu.name })
                return findMenu
              }
              // 找到了 将找到的结果返回
            } else if (menu.type === 2 && menu.url === currentPath) {
              return menu
            }
          }
        }
        

\