两种思路

1 平级路由,通过添加meta来做面包屑

2 嵌套路由,通过新增router-view做切换

注:因为是后台管理系统,左侧有一个sidebar,所以在实现上会比没有sidebar的更复杂

 

面包屑采用elementui的组件,单独提取出来

// breadcrumbList 为在store中存储的面包屑数据

<template>
  <div class="breadcrumb_container">
    <el-breadcrumb separator="/">
      <template v-for="(item, index) in breadcrumbList">
        <el-breadcrumb-item 
        :key="index"
        v-if="item.name"
        :to="{ path: item.path }">{{ item.name }}</el-breadcrumb-item>
      </template>
    </el-breadcrumb>
  </div>
</template>

<script lang="ts">
import { Vue, Component, Provide, Watch, Prop, Model } from 'vue-property-decorator'
import { State } from 'vuex-class'
@Component
export default class Breadcrumb extends Vue{
  @State breadcrumbList!: object[]
}
</script>

 

第一种 - 平级路由

平级路由

vue3 elementplus面包屑文字变白_面包屑

router.beforeEach中更新面包屑的数据

if (to.meta && to.meta.parent) {
    store.state.breadcrumbList = to.meta.parent
  }else{
    store.state.breadcrumbList = [{ path: to.path.split('/')[1], name: to.name }]
  }

效果

vue3 elementplus面包屑文字变白_elementUI_02

vue3 elementplus面包屑文字变白_vue_03

面包屑是没问题了,到这,如果没有左侧sidebar的 就已经结束了

 

但是左侧的sidebar高亮显示没有了~,另外其实面包屑的路径是不完整的,没有包括有子集的一级名称~(因为一级名称并没有相应的页面,只是作为一个容器在用)

sidebar采用的也是elementui的组件 传送门

vue3 elementplus面包屑文字变白_ide_04

vue3 elementplus面包屑文字变白_面包屑_05

因为采取的是路由path作为高亮,而实际上sidebar的数据中并没有这个path,所以就没有高亮了~

这个的解决办法就是

vue3 elementplus面包屑文字变白_elementUI_06

直接读取store中存储的breadcrumbList值

vue3 elementplus面包屑文字变白_数据_07

vue3 elementplus面包屑文字变白_面包屑_08

这样确实保证了左侧的高亮

vue3 elementplus面包屑文字变白_面包屑_09

第一种方法的弊端

1 需要在router.js中额外的写一些meta数据

2 左侧sidebar中 含有子集的一级名称并没有在面包屑中显示

3 更改的地方有点分散,比较乱

关于第二点 感觉可以通过获取左侧菜单数据,然后递归获取about的父级的title做面包屑显示,由于个别原因 并没有继续往下走

vue3 elementplus面包屑文字变白_数据_10

下面说第二种方法 - 嵌套路由 + router-view

vue3 elementplus面包屑文字变白_数据_11

vue3 elementplus面包屑文字变白_数据_12

vue3 elementplus面包屑文字变白_ide_13

index.vue实际上只作为一个入口

vue3 elementplus面包屑文字变白_vue_14

到这 第二种方式就可以正常的显示面包屑了,但是为了左侧sidebar的显示正确 还需要做些其他的

【如果不这样做的话  当路由为/about/add 跳到/about的时候   第一次点击会找不到对应的路由 导致进入404】

 1 sidebar的数据中  index的路由值  需要添加 '/'  

vue3 elementplus面包屑文字变白_vue_15

2 在sidebar组件中 也需要保留'/'

vue3 elementplus面包屑文字变白_elementUI_16

以上~

就没什么问题了

至于三级的sidebar目前项目当中还没出现 所以暂时还没有进行测试

 

elementUI 的el-menu  在点击当前栏目的时候 会报错NavigationDuplicated  但不影响使用

想去除的话 可以在router部分添加

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}