Vue使用addRouter()动态生成三级菜单的问题

标题记录一次vue使用addRouter动态生成三级菜单栏的问题

1.addRouter()里面需要一个固定格式的数组:例如

import { asyncRoutes, constantRoutes } from '@/router'
/* Layout */
import Layout from '@/layout'
/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}

/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles, parentModules) {
  const res = []

  parentModules.forEach(parentModule => {
    var tmp = {}
    tmp.path = parentModule.parentTargetUrl
   
    tmp.component = Layout
    tmp.name = parentModule.parentTargetUrl.substr(1)
    tmp.meta = {}
    tmp.meta.title = parentModule.parentModuleName
    tmp.meta.icon = 'dashboard'
    tmp.meta.roles = roles
    tmp.children = []
    
    parentModule.modules.forEach(module => {
     
      // XXXListPage
      var childrenTmpListPage = {}
      var childrenTmpEditPage = {}
      //childrenTmpListPage.path = '/' + module.targetName + 'ListPage'
      childrenTmpListPage.name = module.targetName + 'ListPage'
      childrenTmpListPage.meta = {}
      childrenTmpListPage.meta.title = module.moduleName
      childrenTmpListPage.meta.icon = 'dashboard'
      childrenTmpListPage.meta.roles = roles
      //childrenTmpListPage.component = resolve => require(['@/page/' + module.targetName.charAt(0).toUpperCase() + module.targetName.slice(1) + '/list_page'], resolve)
      childrenTmpListPage.path = '/' + module.targetName + 'ListPage'
      
      if(module.childrenModules != null && module.childrenModules != undefined && module.childrenModules != ""){
        childrenTmpListPage.component = Layout

      }else{
        
        childrenTmpListPage.component = resolve => require(['@/page/' + module.targetName.charAt(0).toUpperCase() + module.targetName.slice(1) + '/list_page'], resolve)
        
      }


      childrenTmpListPage.children = []
      // XXXEditPage
      // childrenTmpEditPage.path = '/' + module.targetName + 'EditPage'
      // childrenTmpEditPage.name = module.targetName + 'EditPage'
      // childrenTmpEditPage.meta = {}
      // childrenTmpEditPage.meta.title = module.moduleName
      // childrenTmpEditPage.meta.icon = 'dashboard'
      // childrenTmpEditPage.meta.roles = roles
      // childrenTmpEditPage.hidden = true
      // childrenTmpEditPage.component = resolve => require(['@/page/' + module.targetName.charAt(0).toUpperCase() + module.targetName.slice(1) + '/edit_page'], resolve)
       
      // 三级菜单生成
      var roleChildren = roles
      
      if(module.childrenModules != null && module.childrenModules != undefined && module.childrenModules != ""){
        module.childrenModules.forEach(module =>{
 
          var children2TmpListPage = {}
          var children2TmpEditPage = {}
          //  childrenTmpListPage.path
          children2TmpListPage.path = module.targetName + 'ListPage'
          alert(children2TmpListPage.path)
          children2TmpListPage.name = module.targetName + 'ListPage'
          children2TmpListPage.meta = {}
          children2TmpListPage.meta.title = module.moduleName
          children2TmpListPage.meta.icon = 'dashboard'
          children2TmpListPage.meta.roles = roleChildren
          
          children2TmpListPage.component = resolve => require(['@/page/' + module.targetName.charAt(0).toUpperCase() + module.targetName.slice(1) + '/list_page'], resolve)
          console.log('@/page/' + module.targetName.charAt(0).toUpperCase() + module.targetName.slice(1) + '/list_page')
          childrenTmpListPage.children.push(children2TmpListPage)
          
      })
      
    }
      
      tmp.children.push(childrenTmpListPage)
      // tmp.children.push(childrenTmpEditPage)
    })
    res.push(tmp)
    
  })

  console.log(res)
  return res
}

const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, obj) {
    return new Promise(resolve => {
      let accessedRoutes = filterAsyncRoutes(asyncRoutes, obj.roles, obj.parentModules)
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

  1. 三级路由重点:
    componment: 二级路由不能设置为NULL,必须存在,我设置的就是Layout(引用自@/layout)
    path:路径最前面不能使用"/"

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值