侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Vue 动态添加路由及生成菜单的方法示例

前端  /  管理员 发布于 5年前   499

写后台管理系统,估计有不少人遇过这样的需求:根据后台数据动态添加路由和菜单。

为什么这么做呢?因为不同的用户有不同的权限,能访问的页面是不一样的。

在网上找了好多资料,终于想到了解决办法。

动态生成路由

利用 vue-router 的 addRoutes 方法可以动态添加路由。

先看一下官方介绍:

router.addRoutes

router.addRoutes(routes: Array)

动态添加更多的路由规则。参数必须是一个符合 routes 选项要求的数组。

举个例子:

const router = new Router({  routes: [    {      path: '/login',      name: 'login',      component: () => import('../components/Login.vue')    },    {path: '/', redirect: '/home'},  ]  })

上面的代码和下面的代码效果是一样的

const router = new Router({  routes: [    {path: '/', redirect: '/home'},  ]  })router.addRoutes([  {    path: '/login',    name: 'login',    component: () => import('../components/Login.vue')  }])

在动态添加路由的过程中,如果有 404 页面,一定要放在最后添加,否则在登陆的时候添加完页面会重定向到 404 页面。

类似于这样,这种规则一定要最后添加。

{path: '*', redirect: '/404'}

动态生成菜单

假设后台返回来的数据长这样

// 左侧菜单栏数据menuItems: [  {    name: 'home', // 要跳转的路由名称 不是路径    size: 18, // icon大小    type: 'md-home', // icon类型    text: '主页' // 文本内容  },  {    text: '二级菜单',    type: 'ios-paper',    children: [      {        type: 'ios-grid',        name: 't1',        text: '表格'      },      {        text: '三级菜单',        type: 'ios-paper',        children: [          {            type: 'ios-notifications-outline',            name: 'msg',            text: '查看消息'          },          {            type: 'md-lock',            name: 'password',            text: '修改密码'          },          {            type: 'md-person',            name: 'userinfo',            text: '基本资料',          }        ]      }    ]  }]

来看看怎么将它转化为菜单栏,我在这里使用了 iview 的组件,不用重复造轮子。

    
{{threeItem.text}} {{subItem.text}} {{item.text}}

代码不用看得太仔细,理解原理即可,其实就是通过三次 v-for 不停的对子数组进行循环,生成三级菜单。

动态菜单这样就可以实现了。

动态路由,因为上面已经说过了用 addRoutes 来实现,现在看看具体怎么做。

首先,要把项目所有的页面路由都列出来,再用后台返回来的数据动态匹配,能匹配上的就把路由加上,不能匹配上的就不加。

最后把这个新生成的路由数据用 addRoutes 添加到路由表里。

const asyncRoutes = {  'home': {    path: 'home',    name: 'home',    component: () => import('../views/Home.vue')  },  't1': {    path: 't1',    name: 't1',    component: () => import('../views/T1.vue')  },  'password': {    path: 'password',    name: 'password',    component: () => import('../views/Password.vue')  },  'msg': {    path: 'msg',    name: 'msg',    component: () => import('../views/Msg.vue')  },  'userinfo': {    path: 'userinfo',    name: 'userinfo',    component: () => import('../views/UserInfo.vue')  }}// 传入后台数据 生成路由表menusToRoutes(menusData)// 将菜单信息转成对应的路由信息 动态添加function menusToRoutes(data) {  const result = []  const children = []  result.push({    path: '/',    component: () => import('../components/Index.vue'),    children,  })  data.forEach(item => {    generateRoutes(children, item)  })  children.push({    path: 'error',    name: 'error',    component: () => import('../components/Error.vue')  })  // 最后添加404页面 否则会在登陆成功后跳到404页面  result.push(    {path: '*', redirect: '/error'},  )  return result}function generateRoutes(children, item) {  if (item.name) {    children.push(asyncRoutes[item.name])  } else if (item.children) {    item.children.forEach(e => {      generateRoutes(children, e)    })  }}

所有的代码实现,我都放在 github 上,动态菜单的实现放在这个项目下的 src/components/Index.vue、src/permission.js 和 src/utils/index.js下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:

  • 浅入深出Vue之自动化路由
  • vue子路由跳转实现tab选项卡
  • Vue.js路由实现选项卡简单实例
  • vue-router二级导航切换路由及高亮显示的实现方法
  • Vue的路由及路由钩子函数的实现
  • Vue路由前后端设计总结


  • 上一条:
    JavaScript命名空间模式实例详解
    下一条:
    javascript获取select值的方法完整实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客