动态面包屑vue+element ui

4,020 阅读1分钟

前言

改变从行动开始。之前写了vue-cl4 项目的搭建已经遇到的问题。今天带来我们项目中常用的的功能,动态面包屑。

路由配置

一个项目要想动态的生成面包屑,他的路由配置的一定要合理。不然面包屑就会错乱。下面是我简单配置的。路由配置文件

import Vue from 'vue'
import VueRouter from 'vue-router'

//解决路由跳转的时候两次push的path地址相同 报错
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

Vue.use(VueRouter)

  const routes = [
    {path:'/',redirect:'login',meta:{verify:false}},
    {path:'/login',name:'login',component:()=>import('views/login'),meta:{verify:false}},
    {path:'/dashboard',redirect:'homePage',meta:{verify:false}},//此路由是为了给动态面包屑作为首页 避免重复路由报错
    {path:'/home',name:'Home',component:()=>import('views'),meta:{title:'系统配置'},redirect:'/homePage',
      children:[
        {path:'/homePage',name:'HomePage',component:()=>import('views/home/homePage'),meta:{title:'首页',verify:false}},
        {path:'/pay',name:'Pay',component:()=>import('views/home/pay'),meta:{title:'支付管理',verify:false}},
      ]
    },
]

const router = new VueRouter({
  mode:'hash',
  fallback:true,
  routes
})

export default router

复制粘贴的话注意是否有login页面,没有的话可以将/ 和/login路由去掉,避免报错。

breadcrumb组件

创建breadcrumb动态面包屑组件 transition-group为我自定义的路由变化时的动画,去掉即可。效果图

<template>
    <el-breadcrumb class="app-breadcrumb" separator="/">
    <transition-group name="breadcrumb">
       <el-breadcrumb-item v-for="item in levelList" :key="item.path" :to="item.path">{{item.meta.title}}</el-breadcrumb-item>
    </transition-group> 
  </el-breadcrumb>
</template>

<script>
// 原理:通过监听当前路由的变化,动态更新面包屑的内容。
export default {
  name:'Breadcrumb',
  data(){
    return{
        levelList:[]
    }
  },
  created(){
    this.getBreadcrumb()
  },

  watch: {
    $route(route) {
      // if you go to the redirect page, do not update the breadcrumbs
      if (route.path.startsWith('/redirect/')) {
        return
      }
      this.getBreadcrumb()
    }
  },
  methods: {
    getBreadcrumb(){
        let matched = this.$route.matched.filter(item => item.meta && item.meta.title);
        const first = matched[0];
        if (first && first.name.trim().toLocaleLowerCase() !== 'Dashboard'.toLocaleLowerCase()) {
             matched = [{ path: '/dashboard',meta: { title: '首页' }}].concat(matched)
        }
        this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
    },
  }
}
</script>

<style lang='scss' scoped>
.app-breadcrumb.el-breadcrumb {
  font-size: 14px;

  .no-redirect {
    // color: #97a8be;
    color: #000;
    cursor: text;
    font-weight:900;
  }
}
.el-breadcrumb__inner a{
    color: #97a8be !important;
    font-weight:100;
  }

</style>

结束语

改变从心动开始,动态面包屑组件封装就大体这个样,当然项目具体使用中还需做其他优化处理,如过场动画,权限处理,以及路由拦截等等。这里我就简单的处理了下。此项目开源链接。后续会给大家带来http封装,路由拦截,以及项目多环境配置,公共配置,打包成app等处理。希望对大家有所帮助。