vue addRoutes路由动态加载操作


Posted in Javascript onAugust 04, 2020

需求:增加权限控制,实现不同角色显示不同的路由导航

思路:每次登陆后请求接口返回当前角色路由

核心方法:vue-router2.2.0的addRoutes方法 + vuex

以下是我实现的获取菜单路由的方法,我将该方法的调用放在首页组件的生命钩子中,即便用户刷新浏览器清空了路由还是会重新调用接口获取,不至于会丢失。同时考虑到会有切换用户的可能,所以不将获取到的路由信息保存到cookie或者localstorage当中

获取菜单之前先判断routerState,避免多次请求, 我这里使用element-ui的导航菜单功能v-for循环this.myRouter参数即可显示动态路由导航

/**
* 获取菜单
*/
getMenu () {
 if (this.$store.getters.routerState === false) {
 // 清理已经存在的动态路由
 this.clearDynamicRoute()
 // 更改请求路由状态为true
 this.$store.commit('SET_ROUTERSTATE', true)
 getMyMenu().then((res) => {
  if (res.code === '0') {
  // 格式化路由,将数据转为addRoutes可接受的route格式数组
  let myMenu = this.formatMenu(res.data.menu)
  if (myMenu.length <= 0) { // 没有动态路由
   return
  }
  for (let index = 0; index < myMenu.length; index++) {
   // 将请求的路由先存放到options对象中
   this.$router.options.routes.push(myMenu[index])
  }
  // 将完整需要显示的路由添加进去
  this.$router.addRoutes(this.$router.options.routes)
  // 这里将路由显示在页面上
  this.MyRouter = this.$router.options.routes
  }
  // 在这里就可以打印出新路由
  console.log(this.$router)
 })
 }
}

补充知识:vue+element 进入不同路由页面(二级页面),让相应的左侧菜单

路由配置

{
 path: '/finance',
 name: 'Finance',
 meta: {
 title: '财务'
 },
 component: () =>
 import('@/components/Finance'),
 redirect: '/finance/code/code',
 children: [{
 path: '/finance/code',
 name: 'financeindex',
 meta: {
 title: '税收配置'
 },
 redirect: '/finance/code/code',
 component: () =>
 import('@/components/finance/financeindex'),
 children: [{
 path: '/finance/code/code',
 name: 'FinanceCode',
 hidden: false,
 active:'/finance/code', //这里是在左侧菜单显示并且需要选中的
 meta: {
  title: '税收编码(金税)'
 },
 component: () =>
  import('@/components/finance/code/Code'),
 },
 {
 path: '/finance/code/codeimportrecord',  // 这个路由进入的界面是 税收编码(金税)的二级页面, 当进入这个页面的时候,需要菜单中的税收编码(金税)显示选中
 name: 'FinanceCodeImportRecord',
 hidden: true,
 meta: {
 title: '税收编码导入记录'
 },
 component: () =>
 import('@/components/finance/code/CodeImportRecord'),
 },
 {
 path: '/finance/classcode/classcode',
 name: 'FinanceClassCode',
 hidden: false,
 active:'/finance/classcode', //为了省事,只给需要在左侧显示的路由添加active属性
 meta: {
  title: '分类税收编码确认'
 },
 component: () =>
  import('@/components/finance/classCode/ClassCode'),
 },
 ]
 }, ]

element

<template>
 <div class="leftnav">
 <!--<div class="" v-for="nav in navs">
   <div class="LiHeader">
    {{nav.name}}
   </div>
   <li v-for="item in nav.san">
    {{item.name}}
   </li>
  </div>-->
 <el-menu
  style="text-align: left;"
  :default-active=this.show // 这是的值是指与 el-menu-item中:index的值对应的那一天显示选中(正常情况就是一个页面一个路由,进入那个路由,对应的导航菜单需要选中)
  class="el-menu-vertical-demo"
  @open="handleOpen"
  @close="handleClose"
  background-color="#282b33"
  text-color="#bcbcbc"
  active-text-color="#ffffff">
  <div class="" v-for="(nav,index) in navs" :key="index" style="width: 200px;">
  <div class="" style="color: #ffffff;height: 40px;line-height: 40px;padding-left: 20px;font-size: 16px;">
   {{nav.meta.title}}
  </div>
  <el-menu-item @click="clickroute(item.path)" v-for="(item,index) in nav.children" v-if="!item.hidden" :key="index" :index="item.active"(这里原来是item.path) style="height: 40px;line-height: 40px;">{{item.meta.title}}</el-menu-item>
  </div>

 </el-menu>
 </div>
</template>
<script>

js

data() {
  return {
  navs:[],
  show:null //初始化上面:default-active绑定的值
  }
 },
 created() { //// 页面载入的时候,拿到url,用/拆开,然后拼起来前两个路径,并且赋值, 这个时候show对应的就是路由表中的 avtive,
  let route=this.$route.path.split('/')
  let vueRouter=this.$router.options.routes.filter(router=>{return router.path=='/'})[0].children
  let filterVuerouter=vueRouter.filter(router=>{return '/'+route[1] == router.path })
  this.navs=filterVuerouter[0].children
  console.log(this.navs)

  let router ='/'+route[1]+'/'+route[2]
 console.log(router)
  this.show=router
//  console.log(this.show)
 },
 mounted() {

 },

以上这篇vue addRoutes路由动态加载操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javawscript 三级菜单的实现原理
Jul 01 Javascript
JQueryEasyUI datagrid框架的基本使用
Apr 08 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
Oct 22 Javascript
JS基于VML技术实现的五角星礼花效果代码
Oct 26 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
jQuery实现根据生日计算年龄 星座 生肖
Nov 23 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 Javascript
浅谈webpack devtool里的7种SourceMap模式
Jan 14 Javascript
微信小程序实现文件、图片上传功能
Aug 18 Javascript
js+audio实现音乐播放器
Sep 13 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 #Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 #Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 #Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 #Javascript
解决vuecli3中img src 的引入问题
Aug 04 #Javascript
简介JavaScript错误处理机制
Aug 04 #Javascript
vue 出现data-v-xxx的原因及解决
Aug 04 #Javascript
You might like
Zend Framework框架路由机制代码分析
2016/03/22 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
Javascript Objects详解
2014/09/04 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
python中类的一些方法分析
2014/09/25 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python缩进和冒号详解
2016/06/01 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
工作分析计划书
2014/04/30 职场文书
企业文化宣传标语
2014/06/09 职场文书
优秀大学生自荐信
2014/06/09 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
民事起诉书范本
2015/05/19 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers