为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置

2020-06-17 05:30:32易采站长站整理

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 就知道怎么用了