vue动态生成

vue项目根据后端返回的路由动态生成并添加

RouterView代码:

<template>
  <router-view></router-view>
</template>
RouterView只是用来中继子页面,才能让页面保持正常展示
 
如下图是前端页面文件结构

这是后台配置(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 }

 

posted @ 2022-05-13 14:56  豆浆不要油条  阅读(316)  评论(0编辑  收藏  举报