基于iview-admin的动态菜单

基于iview-admin的动态菜单

最近公司前台一直在使用vue,其中一个项目决定使用iview UI库,为了方便我们就使用了官方提供的iview-admin后台模板。可我这个菜鸡使用起来举步维艰,下面给大家介绍一下我们实现动态菜单的可行方案。

思路

  1. 将所有的路由在项目的router/routers.js文件中定义好,一定要按照人家的格式定义。如果是左侧菜单,必须 type:"menu"。并且全部的路由定义时都hideInMenu: true默认隐藏。【默认隐藏为了给动态显示菜单做铺垫,当用户有某某个路由时,我们才显示某个路由,即hideInMenu: false
  2. 登录成功后将用户的认证信息保存到客户端,如vux、localstorage,但vuex刷新页面会丢失。
  3. 进入首页时,通过路由加载菜单

yes,就是这个思路,下面我们具体讲解每一步的实现。

定义routers

额…没有那么高大上,就是在人家iview-admin现成的文件中写入我们自己的路由。编写路由的规范,可以跳到我另一篇:iview-admin路由介绍

代码实现

iview admin的main.vue组件中的导航菜单组件引用的值menuList便是我们要注意的重点。
在这里插入图片描述
vuex中的menuList
在这里插入图片描述
我们着重关注app.js中的getMenuByRouter()
str :用户拥有哪些路由的数组json串,存的是router的name

let str = ''
let arr = ''
export const getMenuByRouter = (list, access) => {
  str = localStorage.getItem('auth_info') // 登录成功后,后台传入的该用户拥有的路由数组
  arr = JSON.parse(str) 
  if (arr == null) return false;
  let res = []
  forEach(list, item => {
    if (arr.indexOf(item.name) >= 0 && item.meta.type == 'menu') {
      item.meta.hideInMenu = false
    }
    if (!item.meta || (item.meta && !item.meta.hideInMenu)) {
      let obj = {
        icon: (item.meta && item.meta.icon) || '',
        name: item.name,
        meta: item.meta
      }
      if ((hasChild(item) || (item.meta && item.meta.showAlways)) 
      		&& showThisMenuEle(item, access)) {
        obj.children = getMenuByRouter(item.children, access)
      }
      if (item.meta && item.meta.href) obj.href = item.meta.href
      if (showThisMenuEle(item, access)) res.push(obj)
    }
  })
  return res
}

为什么根据用户拥有路由,通过遍历就可以动态菜单?

所有的路由我们已经在前台的routers定义好了,默认都是隐藏的。在这遍历用户拥有的路由,判断我们的routers.js中全部路由是否包含用户拥有的路由,将用户拥有的路由,并且是type:menu的,hideInMenu: false设置为false,即显示出来!

本文侧重于提供思路,如果需要源码的话就评论留下联系方式 ~

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 36
    评论
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善良的大铁牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值