vue配置文件自動(dòng)生成路由和菜單實(shí)例代碼
寫(xiě)在前面
每次重復(fù)寫(xiě)路由的時(shí)候是不是會(huì)覺(jué)得很煩,特別是項(xiàng)目大的時(shí)候,路由會(huì)有特別多,看都看不過(guò)來(lái),所以這里我是有了一個(gè)router.json的配置文件來(lái)對(duì)路由做一些簡(jiǎn)單的配置,然后讓路由和左側(cè)菜單欄可以同時(shí)生成。

router.json
主要配置項(xiàng)如下:

{
"name": "routerConfig",
"menu": [{
"id": "1", //路由id,不能重復(fù)
"name": "home",//路由名字
"path": "/homePage",//路由路徑
"label": "首頁(yè)",//菜單標(biāo)題
"selected": true,//默認(rèn)選中
"icon": "el-icon-monitor",//菜單顯示圖標(biāo)
"open": true,//默認(rèn)打開(kāi)
"component": "homePage/homePage.vue",//組件路由
"children": [ //子菜單
{
"id": "3",
"name": "getCover",
"path": "/getCover",
"label": "封面截取",
"selected": false,
"icon": "el-icon-scissors",
"open": false,
"component": "getCover/getCover.vue",
"children": []
}
]
},{
"id": "2",
"name": "testPage",
"path": "/testPage",
"label": "測(cè)試",
"selected": false,
"icon": "el-icon-setting",
"open": false,
"component": "test/test.vue",
"children": []
},{
"id": "5",
"name": "testMenu",
"path": "/testMenu",
"label": "菜單測(cè)試",
"selected": false,
"icon": "el-icon-setting",
"open": false,
"component": "testMenu/testMenu.vue",
"children": []
}]
}
配置主要分為兩部分,一部分由于菜單生成,一部分用于路由生成,當(dāng)然兩者也有共用的部分
路由生成
import Vue from 'vue'
import VueRouter from 'vue-router'
import ro from "element-ui/src/locale/lang/ro";
Vue.use(VueRouter)
//引入配置文件router.json
let routerMenu = require('@/config/router.json');
routerMenu = routerMenu.menu;
let menu = [];
//配置路由
let formatRoute = function (routerMenu,menu){
for(let i = 0; i < routerMenu.length; i++){
let temp = {
path: routerMenu[i].path,
name: routerMenu[i].name,
//這塊要注意
//用require這種方式引入的時(shí)候,會(huì)將你的component分別打包成不同
//的js,加載的時(shí)候也是按需加載,只用訪問(wèn)這個(gè)路由網(wǎng)址時(shí)才會(huì)加載
//這個(gè)js
component: resolve => require([`@/views/${routerMenu[i].component}`], resolve)
};
menu.push(temp);
if(routerMenu[i].children && routerMenu[i].children.length > 0){
//遞歸生成子菜單的路由
formatRoute(routerMenu[i].children,menu);
}
}
}
//初始化
formatRoute(routerMenu,menu);
//重定向設(shè)置
const routes = [
{
path: '/',
redirect: '/homePage'
},
]
//將生成的路由文件push進(jìn)去
for(let i = 0; i < menu.length; i++)
routes.push(menu[i]);
const router = new VueRouter({
routes
})
export default router
菜單生成
<template>
<div id="leftMenu">
</div>
</template>
<script>
export default {
name: "left",
data(){
return{
menu:[]
}
},
methods:{
//通過(guò)路由id來(lái)找節(jié)點(diǎn)
findNodeById(node,id){
for(let i = 0; i < node.length; i++){
if(id == node[i].id){
node[i].selected = true;
if(node[i].children && node[i].children.length > 0){
this.findNodeById(node[i].children,id);
}
node[i].open = !node[i].open;
if(this.$route.path !== node[i].path) this.$router.push(node[i].path);
}else{
node[i].selected = false;
if(node[i].children && node[i].children.length > 0){
this.findNodeById(node[i].children,id);
}else{
}
}
}
},
//選中菜單節(jié)點(diǎn)
chooseNode(id){
this.findNodeById(this.menu,id);
let domTree = this.generatorMenu(this.menu,'',0)
let leftMenu = document.getElementById('leftMenu');
leftMenu.innerHTML = domTree;
},
//動(dòng)態(tài)生成菜單目錄
generatorMenu(menu,temp,floor){
for(let i = 0; i < menu.length; i++){
temp += `<div style="width: max-content">
<div class="menuOption" οnclick="chooseNode(${menu[i].id})"
style="text-indent: ${floor}em;
background-color: ${menu[i].selected?'aquamarine':''};
cursor: pointer;
margin-top: 0.3rem;>
<i class="${menu[i].icon}"></i>
${menu[i].label}`
if(!menu[i].open && menu[i].children && menu[i].children.length > 0){
temp += `<i style="margin-left: 1rem" class="el-icon-arrow-down"></i>`
}else{
if(menu[i].open && menu[i].children && menu[i].children.length > 0){
temp += `<i style="margin-left: 1rem" class="el-icon-arrow-up"></i>`
}
}
temp += `</div>`
if(menu[i].open && menu[i].children && menu[i].children.length != 0){
temp = this.generatorMenu(menu[i].children,temp,floor+1);
}
temp += `</div>`
}
return temp;
}
},
created() {
},
mounted() {
window.chooseNode = this.chooseNode;
let menu = [];
//獲取路由菜單配置文件
const router = require('@/config/router.json');
menu = router.menu;
this.menu = menu;
let domTree = this.generatorMenu(menu,'',0)
let leftMenu = document.getElementById('leftMenu');
leftMenu.innerHTML = domTree;
}
}
</script>
<style scoped>
#leftMenu{
min-height: calc(100vh - 44px - 1rem);
background-color: cornflowerblue;
text-align: left;
padding: 0.5rem 1rem;
font-size: large;
font-weight: bold;
}
.selectedM{
background-color: aquamarine;
}
.menuOption{
cursor: pointer;
}
</style>
效果

左側(cè)菜單便是自動(dòng)生成的,點(diǎn)擊菜單欄也會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的路由地址,當(dāng)然,樣式有點(diǎn)丑,但樣式的話可以自己后續(xù)再調(diào)整。
這樣的話,我們新加菜單的時(shí)候只需要在配置文件中配置好,就可以直接寫(xiě)編寫(xiě)頁(yè)面,這樣也給我們省下了很多時(shí)間。
總結(jié)
到此這篇關(guān)于vue配置文件自動(dòng)生成路由和菜單的文章就介紹到這了,更多相關(guān)vue自動(dòng)生成路由和菜單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用keep-alive時(shí),數(shù)據(jù)無(wú)法刷新的問(wèn)題及解決
這篇文章主要介紹了使用keep-alive時(shí),數(shù)據(jù)無(wú)法刷新的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue3使用TypeIt實(shí)現(xiàn)文字打字機(jī)效果的代碼示例
在現(xiàn)代網(wǎng)頁(yè)設(shè)計(jì)中,文字打字機(jī)效果是一種非常流行的動(dòng)畫(huà)效果,能夠吸引用戶(hù)的注意力并提升用戶(hù)體驗(yàn),本文將介紹如何在 Vue 3 中使用 TypeIt 庫(kù)實(shí)現(xiàn)文字打字機(jī)效果,并分享一些實(shí)用的技巧和示例,需要的朋友可以參考下2025-01-01
解決vue2 在mounted函數(shù)無(wú)法獲取prop中的變量問(wèn)題
這篇文章主要介紹了vue2 在mounted函數(shù)無(wú)法獲取prop中的變量的解決方法 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
vue前端el-input輸入限制輸入位數(shù)及輸入規(guī)則
這篇文章主要給大家介紹了關(guān)于vue前端el-input輸入限制輸入位數(shù)及輸入規(guī)則的相關(guān)資料,文中通過(guò)代碼介紹的介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
vue+elementUI實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了vue+elementUI實(shí)現(xiàn)分頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
vue.js中v-on:textInput無(wú)法執(zhí)行事件問(wèn)題的解決過(guò)程
大家都知道vue.js通過(guò)v-on完成事件處理與綁定,但最近使用v-on的時(shí)候遇到了一個(gè)問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于vue.js中v-on:textInput無(wú)法執(zhí)行事件問(wèn)題的解決過(guò)程,需要的朋友可以參考下。2017-07-07
vue2 mint-ui loadmore實(shí)現(xiàn)下拉刷新,上拉更多功能
這篇文章主要介紹了vue2 mint-ui loadmore實(shí)現(xiàn)下拉刷新,上拉更多功能,需要的朋友可以參考下2018-03-03

