|
@ -1,7 +1,7 @@ |
|
|
<template> |
|
|
<template> |
|
|
<el-breadcrumb class="app-breadcrumb" separator="/"> |
|
|
<el-breadcrumb class="app-breadcrumb" separator="/"> |
|
|
<transition-group name="breadcrumb"> |
|
|
<transition-group name="breadcrumb"> |
|
|
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> |
|
|
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> |
|
|
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span> |
|
|
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span> |
|
|
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> |
|
|
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> |
|
|
</el-breadcrumb-item> |
|
|
</el-breadcrumb-item> |
|
@ -31,14 +31,41 @@ export default { |
|
|
methods: { |
|
|
methods: { |
|
|
getBreadcrumb() { |
|
|
getBreadcrumb() { |
|
|
// only show routes with meta.title |
|
|
// only show routes with meta.title |
|
|
let matched = this.$route.matched.filter(item => item.meta && item.meta.title) |
|
|
let matched = [] |
|
|
const first = matched[0] |
|
|
const router = this.$route |
|
|
|
|
|
const pathNum = this.findPathNum(router.path) |
|
|
if (!this.isDashboard(first)) { |
|
|
// multi-level menu |
|
|
matched = [{ path: '/index', meta: { title: '首页' }}].concat(matched) |
|
|
if (pathNum > 2) { |
|
|
|
|
|
const reg = /\/\w+/gi |
|
|
|
|
|
const pathList = router.path.match(reg).map((item, index) => { |
|
|
|
|
|
if (index !== 0) item = item.slice(1) |
|
|
|
|
|
return item |
|
|
|
|
|
}) |
|
|
|
|
|
this.getMatched(pathList, this.$store.getters.sidebarRouters, matched) |
|
|
|
|
|
} else { |
|
|
|
|
|
matched = router.matched.filter((item) => item.meta && item.meta.title) |
|
|
|
|
|
} |
|
|
|
|
|
if (!this.isDashboard(matched[0])) { |
|
|
|
|
|
matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched) |
|
|
|
|
|
} |
|
|
|
|
|
this.levelList = matched.filter((item) => item.meta && item.meta.title && item.meta.breadcrumb !== false) |
|
|
|
|
|
}, |
|
|
|
|
|
findPathNum(str, char = "/") { |
|
|
|
|
|
let index = str.indexOf(char) |
|
|
|
|
|
let num = 0 |
|
|
|
|
|
while (index !== -1) { |
|
|
|
|
|
num++ |
|
|
|
|
|
index = str.indexOf(char, index + 1) |
|
|
|
|
|
} |
|
|
|
|
|
return num |
|
|
|
|
|
}, |
|
|
|
|
|
getMatched(pathList, routeList, matched) { |
|
|
|
|
|
let data = routeList.find((item) => item.path == pathList[0]) |
|
|
|
|
|
matched.push(data) |
|
|
|
|
|
if (data.children && pathList.length) { |
|
|
|
|
|
pathList.shift() |
|
|
|
|
|
this.getMatched(pathList, data.children, matched) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) |
|
|
|
|
|
}, |
|
|
}, |
|
|
isDashboard(route) { |
|
|
isDashboard(route) { |
|
|
const name = route && route.name |
|
|
const name = route && route.name |
|
@ -65,7 +92,6 @@ export default { |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
line-height: 50px; |
|
|
line-height: 50px; |
|
|
margin-left: 8px; |
|
|
margin-left: 8px; |
|
|
|
|
|
|
|
|
.no-redirect { |
|
|
.no-redirect { |
|
|
color: #97a8be; |
|
|
color: #97a8be; |
|
|
cursor: text; |
|
|
cursor: text; |
|
|