基于iview

编程入门 行业动态 更新时间:2024-10-17 11:27:49

基于iview-admin的动态菜单

思路定义routers代码实现

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

思路

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

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, aess) => {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, aess)) {obj.children = getMenuByRouter(item.children, aess)}if (item.meta && item.meta.href) obj.href = item.meta.hrefif (showThisMenuEle(item, aess)) res.push(obj)}})return res
}

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

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

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

更多推荐

iview

本文发布于:2023-05-28 06:57:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/315148.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:iview

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!