vue动态生成
vue项目根据后端返回的路由动态生成并添加
RouterView代码:
<template>
<router-view></router-view>
</template>
RouterView只是用来中继子页面,才能让页面保持正常展示
如下图是前端页面文件结构
![](https://img2022.cnblogs.com/blog/2475154/202205/2475154-20220513145025483-1089890320.png)
这是后台配置(URL就是路由路径,也是和前端目录路径一致,因为我是直接用URL来映射前端组件)
访问地址
buildRoutes(filterAsyncRoutes(后端返回的菜单))生成的vue路由直接通过 addRoutes直接插入原有的路由里
1 // 加载视图组件 2 function loadView(componentUrl) { 3 return resolve => require.ensure([], () => resolve(require('@/views' + componentUrl))) 4 } 5 6 // 递归构造路由 7 function buildRoutes(routes) { 8 return routes.map(route => { 9 let _route = {}; 10 let meta = { 11 title: route.name, 12 icon: route.icon, 13 }; 14 if (route.type == 1) { // 目录 15 _route.component = route.parentId == 0 ? Layout : RouterView; 16 if (route.children && route.children[0]) { 17 _route.redirect = route.children[0].path; 18 } 19 } else if (route.type == 2) { // 菜单 20 _route.component = loadView(route.url) 21 meta.actionButtonList = route.children || []; 22 } 23 return { 24 path: route.url, 25 name: route.code, 26 ..._route, 27 meta, 28 children: route.type == 1 ? buildRoutes(route.children || []) : [], // 只有目录才去在构造children路由 29 } 30 }) 31 } 32 // 递归过滤掉有重定向却没有children的父级路由 33 function filterAsyncRoutes(routes) { 34 routes = routes.filter(d => { 35 return d.type != 1 || (d.children && d.children.length > 0) 36 }) 37 routes.forEach(route => { 38 if (route.children && route.children.length > 0) { 39 route.children = filterAsyncRoutes(route.children) 40 } 41 }) 42 return routes 43 }