VUE动态路由菜单

vue-admin-template的菜单数据是写死的,可以改成数据库查询动态展示

1 保留基础路由

特别注意,原配置中的*配置要注释或删除,否则后续配置完成后动态菜单刷新会报404错误,该配置需要在addRoutes添加,见后续说明

 

2 获取后端菜单数据

修改getInfo方法,获取菜单数据并保存到vuex中;同时还需后端java接口做好了菜单数据准备

 

 

注:如果后端没准备好,这里menus可以先直接定义数组测试,参考数组

[{
    "component": "Layout",
    "path": "/user",
    "redirect": "/user/list",
    "name": "userManage",
    "meta": {
        "icon": "userManage",
        "title": "用户管理"
    },
    "children": [{
        "component": "user/user",
        "path": "list",
        "name": "userList",
        "meta": {
            "icon": "userList",
            "title": "用户列表"
        }
    }, {
        "component": "user/role",
        "path": "role",
        "name": "roleList",
        "meta": {
            "icon": "role",
            "title": "角色列表"
        }
    }, {
        "component": "user/permission",
        "path": "permission",
        "name": "permissionList",
        "meta": {
            "icon": "permission",
            "title": "权限列表"
        }
    }]
}]

 

3 动态生成路由

根据环境配置导入组件,在vue中,将菜单路径作为参数,实现路由地址的注入

在 src/router 文件夹下,建立两个文件,各只需添加一行代码, 定义导入方法

src/router/_import_development.js

//开发环境导入组件   
module.exports = file => require('@/views/' + file + '.vue').default

src/router/_import_production.js

//生产环境导入组件
module.exports = file => () => import('@/views/' + file + '.vue')

特别注意:上述路径views后面不要遗漏斜杠

4 生成路由

在路由钩子中,过滤路由,并生成路由,核心在src目录下的permission.js中,修改router.beforeEach路由钩子

关键代码:

import Layout from '@/layout'
const _import = require('@/router/_import_' + process.env.NODE_ENV)
// 1.过滤路由
const menus = filterAsyncRouter(store.getters.menus) 
// 2.将*配置直接加载到动态路由,避免404
menus.push({
    path: "*",
    redirect: "/404"
});
// 2.动态添加路由
router.addRoutes(menus) 
// 3.将路由数据传递给全局变量
global.antRouter = menus 
next({
    ...to,
    replace: true
})
// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap) {
  const accessedRouters = asyncRouterMap.filter(route => {
    if (route.component) {
      if (route.component === 'Layout') {
        route.component = Layout
      } else {
        route.component = _import(route.component) // 导入组件
      }
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })
​
  return accessedRouters
}
 

5 合并路由

 

6 测试

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,实现Vue动态路由菜单的思路如下: 1. 在前端配置好整体路由文件,将静态和动态路由分别存储在文件中。 2. 根据后台返回的路由名称数组,解析生成路由配置文件。 3. 将解析出的路由配置文件加载到router上。 4. 根据router生成菜单项。 下面是一个示例代码,演示了如何实现Vue动态路由菜单的思路: ```javascript // 1. 在前端配置好整体路由文件,将静态和动态路由分别存储在文件中 // staticRoutes.js const staticRoutes = [ { path: '/', name: 'Home', component: Home }, // 其他静态路由配置 ]; // dynamicRoutes.js const dynamicRoutes = [ { path: '/role', name: 'Role', component: Role, meta: { requiresAuth: true } // 需要权限验证的路由 }, // 其他动态路由配置 ]; // 2. 根据后台返回的路由名称数组,解析生成路由配置文件 // parseRoutes.js function parseRoutes(routeNames) { const routes = []; routeNames.forEach(routeName => { // 根据routeName解析生成对应的路由配置 const route = { path: `/${routeName}`, name: routeName, component: () => import(`@/views/${routeName}`), meta: { requiresAuth: true } // 需要权限验证的路由 }; routes.push(route); }); return routes; } // 3. 将解析出的路由配置文件加载到router上 // router.js import Vue from 'vue'; import Router from 'vue-router'; import staticRoutes from './staticRoutes'; import dynamicRoutes from './dynamicRoutes'; Vue.use(Router); const router = new Router({ routes: staticRoutes }); // 在获取到后台返回的路由名称数组后,解析生成动态路由配置 const routeNames = ['Role']; // 假设后台返回的路由名称数组为['Role'] const parsedRoutes = parseRoutes(routeNames); // 将动态路由配置添加到router中 router.addRoutes(parsedRoutes); // 4. 根据router生成菜单项 // Menu.vue <template> <div> <ul> <li v-for="route in routes" :key="route.name"> <router-link :to="route.path">{{ route.name }}</router-link> </li> </ul> </div> </template> <script> export default { data() { return { routes: [] // 存储菜单项的数组 }; }, created() { // 在获取到后台返回的路由名称数组后,解析生成动态路由配置 const routeNames = ['Role']; // 假设后台返回的路由名称数组为['Role'] const parsedRoutes = parseRoutes(routeNames); // 将动态路由配置添加到router中 this.$router.addRoutes(parsedRoutes); // 更新菜单项数组 this.routes = this.$router.options.routes; } }; </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值