let curBreadcrumb = state.breadcrumbData.find(
breadcrumb => breadcrumb.path === path
)
curBreadcrumb && (curBreadcrumb.name = name)
}
}
根据路径匹配相应配置数据具体代码
import breadcrumbs from '@/components/breadcrumb/breadcrumb.config.json'function path2Arr(path) {
return path.split('/').filter(p => p)
}
function matchBreadcrumbData (matchPath) {
return path2Arr(matchPath)
.map(path => {
path = path.replace(/^:([^:?]+)(?)?$/, (match, $1) => {
return `_${$1}`
})
return '/' + path
})
.map((path, index, paths) => {
// 第 0 个不需拼接
if (index) {
let result = ''
for (let i = 0; i <= index; i++) {
result += paths[i] }
return result
}
return path
})
.map(path => {
const item = breadcrumbs.find(bread => bread.path === path)
if (item) {
return item
}
return {
name: path.split('/').pop(),
path,
clickable: false,
isShow: true
}
})
}
export default ({ app, store }) => {
app.router.beforeEach((to, from, next) => {
const toPathArr = path2Arr(to.path)
const toPathArrLength = toPathArr.length
let matchPath = ''
// 从 matched 中找出当前路径的路由配置
for (let match of to.matched) {
const matchPathArr = path2Arr(match.path)
if (matchPathArr.length === toPathArrLength) {
matchPath = match.path
break
}
}
const breadcrumbData = matchBreadcrumbData(matchPath)
store.commit('breadcrumb/setBreadcrumb', breadcrumbData)
next()
})
}
面包屑组件
面包屑组件中渲染匹配到的数据
<template>
<div class="bcg-breadcrumb" v-if="isBreadcrumbShow">
<el-breadcrumb separator="/">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbData"
:to="item.clickable ? item.path : ''"
:key="index">
{{ item.name }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
</template><script>
import breadcrumbs from "./breadcrumb.config"
export default {
name: 'Breadcrumb',
computed: {
isBreadcrumbShow () {
return this.curBreadcrumb && this.curBreadcrumb.isShow
},
breadcrumbData () {
return this.$store.state.breadcrumb.breadcrumbData
},
curBreadcrumb () {
return this.breadcrumbData[this.breadcrumbData.length - 1] }
}
}
</script>
cli命令实现
cli命令开发用到的相关库如下:这些就不细说了,基本上看下 README 就知道怎么用了









