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 相关文章推荐
JTrackBar水平拖动效果
Jul 15 Javascript
jquery 选择器引擎sizzle浅析
Feb 06 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
javascript 内置对象及常见API详细介绍
Nov 01 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
vue 指令之气泡提示效果的实现代码
Oct 18 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
Apr 10 Javascript
js微信分享接口调用详解
Jul 23 Javascript
原生js代码能实现call和bind吗
Jul 31 Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 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
图书管理程序(二)
2006/10/09 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python计算回文数的方法
2015/03/11 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
python中sys模块是做什么用的
2020/08/16 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
网络工程师职业规划
2014/02/10 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
大队委员竞选稿
2015/11/20 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript