vue动态生成路由菜单

1.整体思路:
先在前端配置好整体路由文件,静态动态分别用文件存储->
根据后台返回的路由名称数组[“角色管理”]去解析生成路由配置文件->
将解析出的文件加载到router上面->
根据router生成菜单项

2.手撸的代码(内网开发,你懂的),有些地方不是很详细,或者有编码错误,但核心思路和代码都是详细的,还望见谅!

①router文件夹下放2个文件:index. js(放置基础的路由信息)和roleRoute. js(放置需要权限分配的路由)

②index.js文件如下:
import Vue from ‘vue’
import Router from ‘vue-router’
Vue.use(Router)
export const routerMap=[
{path:’/’,name:‘root’,redirect:‘login’},
{path:‘login’,name:‘login’,component: ()=>import("@/views/login")}
]
export default new Router({
routes:routerMap
})

③roleRouter.js文件如下
const createOrderIter = function*(start =0 ,end = Infinity,step=1){
for(let i=start;i<end;i+=step){
yield i
}
}
const getOrderIterator=createOrderIter()
const getOrder=function(){
return getOrderIterator. next().value
}
export default {
menuConfig:{
基础信息管理:{
pages:[“用户管理”,“角色管理”],
icon:“el-icon-s-home”,
order:getOrder()
}
},
funcConfig:{
用户管理:{
path:“user”,meta:{“el-icon-user”,order:getOrder()},name:user,component:()=>import("@/views/user");
角色管理: ……
}
}
}
④在拿到后端的路由名称数组后[“用户管理”],进行解析,并加入到当前路由文件中。
这里我新建了一个loginStore. js
在mutations:{
SET_ROUTE(state,value){
state. routes=createRoutes(value)
routeReset(state.routes);
pushFirstChild(state.routes)
}
}
三个方法写在另外一个setRoute.js文件中
import VueRouter from “vue-router”
import router from “@/route”
import roleRoute from “@/router/roleRoute”
//这个文件就是前面的路由配置文件
const oriRoute =function (routes){
return [{path:"/",name:“route”,component=>import("@/views/layout/layout"),redirect:“login”,children:routes},
{path:"/login",name:“login”,component=>import("@/views/login")}
]
}
const createRoutes=function(value){
let routes = []
const keys=[]
value.forEach(item=>{
if(roleRoute.funcConfig[item]){
routes. push(roleRoute.funcConfig[item])
keys. push(item)
}
})
sessionStorage. setItem(“routes”,JSON.stringify(keys))
routes =orderBy(routes) //根据order进行排序
return oriRoutes(routes)
}
const routeReset()=function(routes=oriRoutes([])){
const newRouter= new VueRouter({routes})
router. matcher=newRouter. matcher
}
const pushFirstChild=function (routes){
route. push(routes[0].children[0].name)
}
export {createRoutes,routeReset,pushFirstChild}
⑤登录退出的时候执行
this. $store. push(“login”)
⑥根据路由去生成菜单点击页,不同项目菜单格式不同,根据router去对应生成就好。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现动态菜单动态路由的方法如下: 1. 在后端定义菜单路由的数据结构,例如: ``` { "menus": [ { "name": "首页", "icon": "el-icon-s-home", "path": "/dashboard", "children": [] }, { "name": "用户管理", "icon": "el-icon-user", "path": "/user", "children": [ { "name": "用户列表", "path": "/user/list" }, { "name": "新增用户", "path": "/user/add" } ] } ], "routes": [ { "name": "Dashboard", "path": "/dashboard", "component": "Dashboard" }, { "name": "用户列表", "path": "/user/list", "component": "UserList" }, { "name": "新增用户", "path": "/user/add", "component": "UserAdd" } ] } ``` 2. 在前端根据后端返回的数据生成菜单路由,例如: ``` // 生成路由 function generateRoutesFromMenu(routes, menus) { menus.forEach(menu => { if (menu.path) { const route = { path: menu.path, name: menu.name, component: () => import(`@/views/${menu.path}.vue`) }; routes.push(route); } if (menu.children) { generateRoutesFromMenu(routes, menu.children); } }); } // 生成菜单 function generateMenusFromRoutes(routes) { const menus = []; routes.forEach(route => { if (route.path !== '/') { const menu = { name: route.name, path: route.path }; menus.push(menu); } }); return menus; } // 定义路由 const router = new VueRouter({ mode: 'history', routes: [] }); // 获取后端返回的菜单路由数据 axios.get('/api/menus').then(response => { const menus = response.data.menus; const routes = response.data.routes; generateRoutesFromMenu(routes, menus); router.addRoutes(routes); const dynamicMenus = generateMenusFromRoutes(routes); // 将菜单存入 Vuex 中 store.commit('setMenus', dynamicMenus); }); ``` 3. 在前端页面中根据菜单路由展示页面和菜单,例如: ``` // 显示菜单 <el-menu :default-active="$route.path" class="el-menu-vertical-demo" :router="true" :collapse="collapse"> <div class="logo"> <img src="@/assets/logo.png" alt="logo"/> <span v-show="!collapse">Vue Admin</span> </div> <el-submenu v-for="menu in menus" :key="menu.path" :index="menu.path"> <template slot="title"> <i :class="menu.icon"></i> <span>{{ menu.name }}</span> </template> <el-menu-item v-for="child in menu.children" :key="child.path" :index="child.path">{{ child.name }}</el-menu-item> </el-submenu> </el-menu> // 显示页面 <template> <div class="dashboard"> <h1>{{title}}</h1> <p>{{content}}</p> </div> </template> <script> export default { name: 'Dashboard', data() { return { title: 'Dashboard', content: 'Welcome to Vue Admin!' } } } </script> <style scoped> .dashboard { text-align: center; } </style> ``` 这样就可以实现动态菜单动态路由了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路追求匠人精神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值