首页 > 技术文章 > vue 权限路由动态加载

moon-yyl 2020-12-15 18:54 原文

 

1.正常的思路前端把常用的路由和需要后端权限的路由分开,然后需要权限的路由又后端直接返回数据,前端处理成路由动态加载的数据。

后端返回的数据:

let menuList = [{
    "id": "5fd1d86a8bf1c51a5cc1a76d",
    "path": "/test",
    "component": "Layout",
    "name": "test",
    "redirect": "/test/admin",
    "hidden": false,
    "meta": {
      "title": "合作商管理",
      "roles": ["admin"],
      "icon": "test",
      "noCache": true
    },
    "children": [{
      "id": "5fd1d86a8bf1c51a5cc1a76e",
      "path": "admin",
      "component": "/test/index",
      "name": "test",
      "hidden": false,
      "meta": {
        "title": "合作商列表",
        "roles": ["admin"],
        "icon": "partner",
        "noCache": true
      }
    }]
  }]

  2.前端需要把这个数据变成路由动态加载

let filterRouters = filterAsyncRouter(menuList)
//遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter (routes) {
  const accessedRouters = routes.filter(route => {
    if (route.component === 'Layout') {
      route.component = Layout
    } else {
      if (route.path.indexOf(':') > -1) {
        const component = route.component
        route.component = resolve => require([`@/views${component}`], resolve)
        //  route.component = () => import(`@/views${route.component.substr(0, route.component.indexOf(':') - 1)}`)
      }
      else {
        const component = route.component
        route.component = resolve => require([`@/views${component}`], resolve) 
        //  route.component = () => import(`@/views${component}`)
      }
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })
  return accessedRouters
}

  3.添加路由

router.options.routes = store.getters.routes
router.addRoutes(store.getters.routes)
next({ ...to, replace: true }  

说明:
1.在2中标红的地方是因为webpack 版本不一样,导致用import 加载不了,这块研究了半天。

 

参考文案:https://www.cnblogs.com/mark5/p/12101906.html

 

 

 

推荐阅读