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)文章
vuex中數(shù)據(jù)持久化插件vuex-persistedstate使用詳解
這篇文章主要介紹了vuex中數(shù)據(jù)持久化插件vuex-persistedstate使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03在vue項(xiàng)目中集成graphql(vue-ApolloClient)
這篇文章主要介紹了在vue項(xiàng)目中集成graphql(vue-ApolloClient),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Vue項(xiàng)目部署到j(luò)enkins的實(shí)現(xiàn)
本文主要介紹了Vue項(xiàng)目部署到j(luò)enkins的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02在Vue中使用Viser說(shuō)明(基于AntV-G2可視化引擎)
這篇文章主要介紹了在Vue中使用Viser說(shuō)明(基于AntV-G2可視化引擎),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10Vue配合Vant使用時(shí)area省市區(qū)選擇器的使用方式
這篇文章主要介紹了Vue配合Vant使用時(shí)area省市區(qū)選擇器的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法
這篇文章主要為大家詳細(xì)介紹了vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08詳解Vue用自定義指令完成一個(gè)下拉菜單(select組件)
本篇文章主要介紹了詳解Vue用自定義指令完成一個(gè)下拉菜單(select組件),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10