vue + element 动态面包屑

两种思路

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

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

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

 

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

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



 

第一种 - 平级路由

平级路由

vue + element 动态面包屑_第1张图片

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 }]
  }

效果

vue + element 动态面包屑_第2张图片

vue + element 动态面包屑_第3张图片

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

 

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

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

vue + element 动态面包屑_第4张图片

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

这个的解决办法就是

直接读取store中存储的breadcrumbList值

vue + element 动态面包屑_第5张图片vue + element 动态面包屑_第6张图片

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

vue + element 动态面包屑_第7张图片

第一种方法的弊端

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

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

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

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

vue + element 动态面包屑_第8张图片

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

vue + element 动态面包屑_第9张图片

vue + element 动态面包屑_第10张图片

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

vue + element 动态面包屑_第11张图片

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

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

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

vue + element 动态面包屑_第12张图片

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

vue + element 动态面包屑_第13张图片

以上~

就没什么问题了

至于三级的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)
}

 

你可能感兴趣的:(vue模块及通用方法)