简单动态路由

文章介绍了如何使用iview-admin框架处理后台返回的路由数据,通过lowdb进行本地存储以防止刷新丢失。步骤包括格式化路由数据、转换文件路径、过滤并转换为路由所需格式,以及动态创建菜单并存储到store中。
摘要由CSDN通过智能技术生成

示例选用的iview-admin实现,store存数据刷新要丢失,可以使用lowdb插件本地存储。

1.后台返回的路由数据格式化
component里面是view文件的路径地址

           let menu = [{
            path: '/',
            name: '_home',
            redirect: '/home',
            type: 'menu',
            component: 'Main',
            meta: {
              hideInMenu: true,
              notCache: true
            },
            children: [
              {
                path: '/home',
                name: 'home',
                type: 'menu',
                meta: {
                  hideInMenu: true,
                  title: '首页',
                  notCache: true,
                  icon: 'md-home'
                },
                component: '/single-page/home'
              }
            ]
          },
          {
            path: '',
            name: 'doc',
            type: 'blank',
            meta: {
              title: '新页签打开路由',
              icon: 'ios-book'
            },
            component: '/blank'
          },
          {
            path: '',
            name: 'doc',
            type: 'inHref',
            meta: {
              title: '外部链接',
              href: 'https://lison16.github.io/iview-admin-doc/#/',
              icon: 'ios-book'
            },
            component: '/Frame'
          },
          {
            path: '/update',
            name: 'update',
            type: 'menu',
            meta: {
              icon: 'md-cloud-upload',
              title: '数据上传'
            },
            component: 'Main',
            children: [
              {
                path: 'update_table_page',
                name: 'update_table_page',
                meta: {
                  icon: 'ios-document',
                  title: '上传Csv'
                },
                type: 'menu',
                component: '/update/update-table'
              },
              {
                path: 'update_paste_page',
                name: 'update_paste_page',
                meta: {
                  icon: 'md-clipboard',
                  title: '粘贴表格数据'
                },
                type: 'menu',
                component: '/update/update-paste'
              }
            ]
          }]

2.新建文件_import_development.js将菜单数据转换成路由需要的文件路径格式

module.exports = file => () => import('@/view' + file + '/index.vue')

3.使用filterAsyncRouter方法,将后端返回的路由改为路由需要的数据

import _import from '@/router/_import_development.js'

import Main from '@/components/main/index.vue' // Layout 是架构组件,不在后台返回,在文件里单独引入
import Frame from '@/view/frame/index.vue'

export const filterAsyncRouter = (asyncRouterMap, parentName, router) => { // 遍历后台传来的路由字符串,转换为组件对象
  const accessedRouters = asyncRouterMap.filter(route => {
    if (route.component) {
      if (route.component === 'Main') { // Layout组件特殊处理
        route.component = Main
      } else if (route.type && route.type === 'inHref') {
        // 内嵌外链的方式
        route.component = Frame
        route.meta.frame = 'inside'
      } else {
        route.component = _import(route.component)
        // 新页签打开内部路由
        if (route.type && route.type === 'blank') {
          route.meta.frame = 'blank'
        }
      }
      router.addRoute(parentName || '', {
        path: route.path,
        component: route.component,
        name: route.name,
        redirect: route.redirect,
        meta: route.meta
      })
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route.name, router)
    }
    return true
  })

  return accessedRouters
}

注意:这里添加路由是嵌套路由,不然没有框架,没法切换菜单
在这里插入图片描述
4.路由next()
在这里插入图片描述
5.在登录的时候调用获取菜单接口,调用filterAsyncRouter方法,存储菜单,在菜单栏使用

 // 动态创建菜单,存入store里面
          let menuSider = filterAsyncRouter(menu, '', router)
          commit('setMenuList', menuSider, { root: true })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值