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 相关文章推荐
js onclick事件传参讲解
Nov 06 Javascript
利用jquery写的左右轮播图特效
Feb 12 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
js中的内部属性与delete操作符介绍
Aug 10 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
去除html代码里面的script正则方法
May 19 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
深入浅出es6模板字符串
Aug 26 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
JavaScript实现刮刮乐效果
Nov 01 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 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
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php生成短域名函数
2015/03/23 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python实现控制台进度条功能
2016/01/04 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
深入理解Python 多线程
2020/06/16 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
创建学习型党组织实施方案
2014/03/29 职场文书
大学社团计划书
2014/05/01 职场文书
办公室个人总结
2015/02/28 职场文书
亲情作文之母爱
2019/09/25 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
nginx实现动静分离的方法示例
2021/11/07 Servers