封装面包屑

69 阅读2分钟

基于 element -ui 库 二次封装 面包屑

如果是只展示当前对应路由的这个面包屑

1.在router 中定义一个mate

因为父级也需要展示,所以这里 父级也需要配置mate属性

image.png

import Vue from 'vue' 
import VueRouter from 'vue-router' 
import Main from '@/views/Main' 
import Cookies from 'js-cookie' 
Vue.use(VueRouter) 
const routes = [ 
{ path: '/login', name: 'login', component: () => import(/* webpackChunkName: "page" */ "@/views/LoginPage"), meta: { keepAlive: true, isTab: false, isAuth: false, }, },
{ path: '/404', name: '404', component: () => import(/* webpackChunkName: "page" */ '@/views/error/404'), hidden: true }, 
{ path: '/401', name: '401', component: () => import(/* webpackChunkName: "page" */ '@/views/error/401'), hidden: true },
{ path: '/', component: Main, name: 'Main', redirect: '/home', children: [ { path: 'home', component: () => import('@/views/Home'), name: '首页', meta: { title: '首页', noCache: true } }, { path: 'user', component: () => import('@/views/User'), name: '用户管理', meta: { title: '用户管理', noCache: true } }, 
{ path: 'guide', component: () => import('@/views/Guide'), name: '引导页', meta: { title: '引导页', noCache: true } }, ] }, { name: '权限测试页', component: Main, path:'/role1', redirect: '/role', meta: { title: '权限测试页', noCache: true }, children: [ { name: '页面权限', path: '/role', redirect: 'roleone', meta: { title: '页面权限', noCache: true }, children: [ { path: "roleone", component: () => import('@/views/role/RoleOne'), name: "菜单-1-1", meta: { title: '菜单-1-1', noCache: true }, }, 
{ path: "roletwo", component: () => import('@/views/role/RoleTwo'), name: "菜单-1-2", meta: { title: '菜单-1-2', noCache: true }, }, ] } ], }, { path: "*", redirect: "/404", }, ] 

const router = new VueRouter({ mode: 'hash', scrollBehavior: () => ({ y: 0 }), routes }) 

// 解决ElementUI报重复点击菜单错误
const originalPush = router.push router.push = function push(location) { return originalPush.call(this, location).catch(err => err) } 

router.beforeEach((to, from, next) => { 
// 判断token 
const token = Cookies.get('Admin-Token') 
if (!token && to.name !== 'login') { next({ name: 'login' }) } 
else if (token && to.name == 'login') { next({ name: '首页' }) } else { next() } }) export 

default router

在页面中展示

需要写个方法

image.png

image.png

// 监听路由信息对象中的path属性 "$route.path"() { this.calcBreaks(); },
需要监听路由变化

<template> 
<div class="header-container"> 
<div class="l-content"> 
<!-- --> 
<el-button icon="el-icon-menu" size="mini" @click="handMenu"></el-button> 
<!-- 面包屑 --> 
<el-breadcrumb separator="/"> 
<el-breadcrumb-item v-for="item in levelList" :key="item.key" :to="{ path: item.path }">{{ item.title }}</el-breadcrumb-item> 
</el-breadcrumb> 
</div> 
<div class="r-content"> 
<el-dropdown trigger="click" @command="handleCommand"> 
<span class="user"> 
<el-avatar icon="el-icon-user-solid"></el-avatar> 
</span> <el-dropdown-menu slot="dropdown"> 
<el-dropdown-item command="userInfo">个人信息</el-dropdown-item> 
<el-dropdown-item command="logout">退出</el-dropdown-item> 
</el-dropdown-menu> </el-dropdown> 
</div> 
</div> 
</template> 
<script> 
import { mapState, mapMutations } from 'vuex' 
import Cookies from 'js-cookie' 
export default { 
data() { 
return { 
levelList:[] 
} 
}, 
created() { 
// 执行计算面包屑路径函数 
this.calcBreaks(); 
}, 
methods: { 
...mapMutations(['cleanMenu']), 
handMenu() { 
this.$store.commit('CollapseMenu') 
}, 
handleCommand(command) { 
if (command == 'logout') { 
this.$store.dispatch('LogOut').then(res => {
// 清除cookie 
console.log('logout'); 
Cookies.remove('Admin-Token')
Cookies.remove('crumbList'); 
this.cleanMenu() 
this.$router.push('/login') 
})
} 
}, 
// 计算面包屑路径 
calcBreaks() { // let temp = [{ to: "/home", title: "首页" }]; 
let matched = this.$route.matched .filter((v) => v.meta.title) .map((v) => { return { to: v.path, title: v.meta.title }; }); this.levelList = [...matched]; }, }, 
watch: { 
// 监听路由信息对象中的path属性 
"$route.path"() {
this.calcBreaks(); 
}, 
}, 
computed: { } 
} 
</script> 
<style lang="scss" scoped> 
.header-container { 
padding: 0 20px; 
background-color: #333; 
height: 60px; 
display: flex; 
justify-content: space-between; 
align-items: center; 
.l-content { display: flex; 
flex-direction: row; align-items: center; 
.el-button--mini { margin-right: 10px; } } } 
:deep.el-breadcrumb__item { 
.el-breadcrumb__inner { 
font-weight: normal; 
&.is-link { 
color: #909496; 
} 
} 
&:last-child { 
.el-breadcrumb__inner { 
color: #fff; 
} 
} 
} 
</style>

image.png

image.png