vue addRoutes实现动态权限路由菜单的示例

  

  

最近接手一个后台管理系统,需要实现导航菜单从后台拉取的效果,根据登录用户的权限不同分别拉出来的导航菜单也不一样,另外可操作的界面也存在区别。

  

  

因为后台管理系统是准备使用vue + vue-router + element-ui + vuex的搭配来做的,可是单页应用在进入页面之前就已经将vue-router实例化并且注入vue实例中了,所以在进入登录页面的时候旧没办法在重新定制路由了。接下来各种百之谷之,发现vue-router在2.0版本中提供了addRoutes方法添加路由,希望的曙光出现。
  

  

经过一番折腾终于实现了功能,记录下来便于回顾,也希望能帮助到同样有需求的同志。

  

  

1,首先在本地配置好固定不变的路由地址,例如登录,404这些页面,如下:

        从“Vue”进口Vue   从“vue-router”进口路由器   从“@/vuex/商店”进口商店   Vue.use(路由器)      让路由器=new路由器({   路线:[   {   路径:/登录,   名称:“登录”,   元:{requireAuth:假},//模块使用异步加载   组件:(解决)=比;要求([' . ./组件/登录/登录。vue '],解决)   })   })//拦截登录,令牌验证   路由器。beforeEach(下),从=比;{   如果(to.meta。requireAuth===未定义){   如果(store.state.token) {   next ()   其他}{   下一个({   路径:/登录的   })   }   其他}{   next ()   }   })   出口的默认路由器      

配置好这些固定的路由后我们才能够到登录页面,不然是无法继续下去的。

  

2,然后重要的一步,我们需要跟后端老铁约定好需要返回的权限菜单列表信息,首先这里我们先分析一下自己需要的路由结构,这里以我自己的路由作为例子。如果是我自己直接定义路由的话,会是以下结构:

        让路由器=new路由器({   路线:[   {   路径:/登录,   名称:“登录”,   元:{requireAuth:假},   组件:(解决)=比;要求([' . ./组件/登录/登录。vue '],解决)   },   {   路径:“/?   重定向:“/布局”   },   {   路径:/布局,   组件:(解决)=比;需要([' . ./布局。vue '],解决),   孩子:(   {   路径:“指数”,   元:{   类型:' 1 ',//控制是否显示隐藏1显示,2隐藏   代码:00010001,//后面需要控制路由高亮   标题:“首页',//菜单名称   permissonList:[]//权限列表   }   组件:(解决)=比;要求([' @/组件/索引/索引。vue '],解决)   },   {   …   }   ]   })   })      

根据以上结构分析,其实真正需要动态配置的路由其实是/布局下面儿童的部分,所以需要后端返回给我们包含所有路由的一个数组就可以了

  

 vue addRoutes实现动态权限路由菜单的示例“> <br/>
  </p>
  <p>返回的数据中rootList中是一级导航的列表,一级导航实际是没有路由功能,只是作为切换二级菜单的触发器,分表才是我们真正需要的路由信息。<br/>
  </p>
  <p> 3,拿到权限路由信息后,需要我们在本地对数据进行处理组装成我们需要的数据:</p>
  
  <pre类=//登录   登录(){   让params={   账户:this.loginForm.username,   密码:加密(this.loginForm.password)   }   这一点。加载=true   http.post美元(这。美元bumng +/登录,这个。惠普美元(params))   不要犹豫((res)=比;{   这一点。日志=false   console.info(“菜单列表:“res)   如果(res.resultCode===这。state_ok美元){//合并一级菜单和二级菜单,便于显示   让菜单=handleMenu.mergeSubInRoot (res。rootList res.subList)//本地化处理好的菜单列表   这一点。储蓄者({标签:“menuList”,价值:菜单})//根据子列表处理路由   让路线=handleMenu.mergeRoutes (res.subList)//本地化分表,便于在刷新页面的时候重新配置路由   这一点。储蓄者({标签:“子列表”,价值:res.subList})//防止重复配置相同路由   如果(router.options.routes美元。长度& lt;=1) {   美元。router.addRoutes(路线)//这个。路由器不美元是响应式的,所以手动将路由元注入路由对象   美元。router.options.routes.push(路线)   }   router.replace美元。(“/布局/指数”)   }   })   .catch ((err)=比;{   这一点。日志=false   控制台。错误(“错误:“犯错)   })   },

vue addRoutes实现动态权限路由菜单的示例