位置: IT常识 - 正文

el-menu动态加载路由,菜单的解决方案(element级联动态加载)

编辑:rootadmin
el-menu动态加载路由,菜单的解决方案 先看需要实现的效果

推荐整理分享el-menu动态加载路由,菜单的解决方案(element级联动态加载),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:el-cascader动态加载,element级联动态加载,elementui动态加载菜单,elementui动态加载菜单,element级联动态加载,element ui table动态加载数据,elementui动态加载菜单,element ui table动态加载数据,内容如对您有帮助,希望把文章链接给更多的朋友!

这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜单展示的路由 还有一点要注意,就是这里有两个router-view,整个页面是一个router-view,可以由LoginView和HomeView替换(当前看到的页面),而HomeView下又有一个router-view,需要用来展示部门,系统,超时,员工设置,不合格品列表和不合格品详情页。

以上的信息均需要在数据库的表中体现 先看看直接写在代码里需要哪些操作

const routes = [ { path: '', name: 'login', component: LoginView, } , { component: HomeView, children: [ { path: '/home', name: '不合格品列表', component: BelowStandard }, { path: '/product/:id', name: '不合格品详情', component: BelowStandardDetail } ] }, { component: HomeView, name: '选项设置', children: [ { path: '/employee', name: '员工设置', component: EmployeeConfig, }, { path: '/department', name: '部门设置', component: DepartmentConfig }, { path: '/system', name: '系统设置', component: SystemConfig }, { path: '/warn', name: '超时提醒', component: WarmConfig } ] }, { component: HomeView, children: [ { path: '/statistics', name: '统计', component: DailyStatistics } ] }, { component: HomeView, children: [ { path: '/log', name: '日志管理', component: LogManager } ] },]

这是路由,当要动态从数据库加载时,就不能写在这

<el-menu router active-text-color="#ffd04b" background-color="#000" class="el-menu-vertical-demo" :default-active="this.$route.path" text-color="#fff" @open="" @close="" > <el-menu-item index="/home"> <template #title> 不合格品列表 </template> </el-menu-item> <el-sub-menu index="/subMenuConfig"> <template #title> 选项设置 </template> <el-menu-item index="/department">部门设置</el-menu-item> <el-menu-item index="/system">系统设置</el-menu-item> <el-menu-item index="/warn">超时设置</el-menu-item> <el-menu-item index="/employee">员工设置</el-menu-item> </el-sub-menu> <el-menu-item index="/statistics"> <span>统计</span> </el-menu-item> <el-menu-item index="/log"> <span>日志管理</span> </el-menu-item> </el-menu>

这是el-menu开启了路由功能,所以能跳转路由,当动态加载的时候,这部分需要改造成v-for

数据库el-menu动态加载路由,菜单的解决方案(element级联动态加载)

说明:parent_id为0的即是一级目录,但是一级目录里一部分可以直接展示界面,一部分是展开二级目录,我这是以component字段为home/HomeView.vue来区分是展示二级目录。

现在开始写后端程序,返回菜单的json格式数据。

List<Menu> menuList = menuMapper.getMenuByUserId(UserUtils.getLoginUser().getId());//根据ParentId分组Map<Integer, List<Menu>> map = menuList.stream().collect(Collectors.groupingBy(Menu::getParentId, TreeMap::new,Collectors.toList()));List<Menu> menus = map.get(0);//一级菜单menus.forEach(menu->{//给有二级菜单的目录设置children属性 List<Menu> children = map.get(menu.getId()); menu.setChildren(children);});return menus;

从数据库查询到的数据格式如图,然后分一级二级菜单处理后,再返回前端

[{"name": "不合格品列表","path": "/home","component": "product/BelowStandard.vue","orderNum": 1,"parentId": 0,"isHidden": false,"children": null},{"name": "选项设置","path": "/subMenuConfig","component": "home/HomeView.vue","orderNum": 2,"parentId": 0,"isHidden": false,"children": [{"name": "员工设置","path": "/employee","component": "config/EmployeeConfig.vue","orderNum": 1,"parentId": 2,"isHidden": false,"children": null},{"name": "部门设置","path": "/department","component": "config/DepartmentConfig.vue","orderNum": 2,"parentId": 2,"isHidden": false,"children": null},{"name": "系统设置","path": "/system","component": "config/SystemConfig.vue","orderNum": 3,"parentId": 2,"isHidden": false,"children": null},{"name": "超时提醒","path": "/warn","component": "config/WarmConfig.vue","orderNum": 4,"parentId": 2,"isHidden": false,"children": null}]},{"name": "统计","path": "/statistics","component": "statistics/DailyStatistics.vue","orderNum": 3,"parentId": 0,"isHidden": false,"children": null},{"name": "日志管理","path": "/log","component": "log/LogManager.vue","orderNum": 4,"parentId": 0,"isHidden": false,"children": null},{"name": "不合格品详情","path": "/product/:id","component": "product/BelowStandardDetail.vue","orderNum": 5,"parentId": 0,"isHidden": true,"children": null}]

前端得到数据之后进行处理,再添加到路由,过程中遇到一个问题,vue-router4版本去掉addRoutes换成addRoute带来的问题困扰我很久,详情可以查看另一篇笔记: 第一次push路由不匹配

初始化路由:

router.beforeEach((to, from, next) => {//配置路由守卫 if(to.path==='/'){ next() }else if(store.state.user.id){ initMenus(router,store,next,to) }else{ next({ path: '/',query: {redirect: to.path}}); }});export const initMenus = (router, store,next,to) => {//按F5刷新的话vuex里的会被清空,长度变为0 if (store.state.menu !== null) { next() }else { axios.get("/menu").then(response => { if (response) { let responseData = response.data if (responseData.flag) { store.state.menu = responseData.data initRoute(router,store.state) next({...to,replace:true})//解决router4版本的第一次路由不匹配问题 } else { this.$ElMessage.error('请求菜单失败') } } }) }}const initRoute = (router,state)=> { const loadView = view => {//这种引入方式控制台不会报警告 // 路由懒加载 return () => import(`@/views/${view}`) }; const menus = state.menu const firstLevelMenu = { children: [], component: loadView('home/HomeView.vue') } menus.forEach(menu=>{ menu.component = loadView(menu.component) if(menu.children === null || menu.children.length === 0){ firstLevelMenu.children.push(menu) }else{ menu.children.forEach(children=>{ children.component = loadView(children.component) }) router.addRoute(menu) } }) router.addRoute(firstLevelMenu)}

完成这些配置之后,路由就能动态加载了,然后取出vuex中存储的menu生成el-menu vuex中菜单大致如图

<el-menu router active-text-color="#ffd04b" background-color="#000" class="el-menu-vertical-demo" :default-active="this.$route.path" text-color="#fff" @open="" @close=""> <template v-for="route of this.$store.state.menu"> <template v-if="route.children === null || route.children.length === 0"><!--一级菜单--> <template v-if="!route.isHidden"> <el-menu-item :index = "route.path"> <span>{{route.name}}</span> </el-menu-item> </template> </template> <template v-else><!--二级菜单--> <template v-if="!route.isHidden"> <el-sub-menu :index = "route.path"> <template #title> <span>{{route.name}}</span> </template> <template v-for="children of route.children"> <template v-if="!children.isHidden"> <el-menu-item :index = "children.path"> <span>{{children.name}}</span> </el-menu-item> </template> </template> </el-sub-menu> </template> </template> </template></el-menu>

实现效果展示

本文链接地址:https://www.jiuchutong.com/zhishi/295950.html 转载请保留说明!

上一篇:Chat GPT5的主要介绍(gpts)

下一篇:网页表单文本框的自动填写(四种方法)(网页单行文本框)

  • 安卓手机如何打开.pages文件(安卓手机如何打开.z删除ip文件)

    安卓手机如何打开.pages文件(安卓手机如何打开.z删除ip文件)

  • 华为笔记本搭载鸿蒙系统了吗(华为笔记本搭载锐龙r76800h)

    华为笔记本搭载鸿蒙系统了吗(华为笔记本搭载锐龙r76800h)

  • 微信红包怎么退回(微信红包怎么退回给自己)

    微信红包怎么退回(微信红包怎么退回给自己)

  • 滴滴长途单有空返费嘛(滴滴长途单不付钱怎么办)

    滴滴长途单有空返费嘛(滴滴长途单不付钱怎么办)

  • 新充电宝里面是虚电吗(新充电宝里面是松的)

    新充电宝里面是虚电吗(新充电宝里面是松的)

  • 怎么查看微信被谁投诉举报(怎么查看微信被别人拉黑删除)

    怎么查看微信被谁投诉举报(怎么查看微信被别人拉黑删除)

  • 微信咋建一个群(怎么微信建一个群)

    微信咋建一个群(怎么微信建一个群)

  • 手机放水里泡多久会坏(手机放水里泡多了会坏吗)

    手机放水里泡多久会坏(手机放水里泡多了会坏吗)

  • 小米新机mix4发布时间(小米mix4发热严重官方回应)

    小米新机mix4发布时间(小米mix4发热严重官方回应)

  • cpu控制器的功能是什么(cpu控制器的功能是进行逻辑运算)

    cpu控制器的功能是什么(cpu控制器的功能是进行逻辑运算)

  • 华为手环b2功能详解(华为手环b2使用说明)

    华为手环b2功能详解(华为手环b2使用说明)

  • 爱奇艺没字幕怎么回事(爱奇艺没字幕怎么调)

    爱奇艺没字幕怎么回事(爱奇艺没字幕怎么调)

  • 苹果8p跑分多少正常

    苹果8p跑分多少正常

  • 华为mate30与vivos6对比(华为mate30与30pro的区别)

    华为mate30与vivos6对比(华为mate30与30pro的区别)

  • 电车充电器红灯一闪一闪什么情况(电车充电器红灯一闪一闪的什么情况)

    电车充电器红灯一闪一闪什么情况(电车充电器红灯一闪一闪的什么情况)

  • ps下载不了怎么办(ps下载不下来)

    ps下载不了怎么办(ps下载不下来)

  • 截好图怎样发送(截好图怎样发送到朋友圈)

    截好图怎样发送(截好图怎样发送到朋友圈)

  • 小米9pro月亮模式怎么开(小米九手机的月亮模式在哪开启)

    小米9pro月亮模式怎么开(小米九手机的月亮模式在哪开启)

  • 大众点评删除聊天记录(大众点评删除聊天在线咨询)

    大众点评删除聊天记录(大众点评删除聊天在线咨询)

  • 韩剧tv为什么停止更新了(韩剧tv叫停原因)

    韩剧tv为什么停止更新了(韩剧tv叫停原因)

  • 点读笔是通用的吗(点读笔通用的哪个品牌的好)

    点读笔是通用的吗(点读笔通用的哪个品牌的好)

  • 苹果电池维修什么意思(苹果电池维修是什么)

    苹果电池维修什么意思(苹果电池维修是什么)

  • 苹果xs发热怎么办(iphone xs发热严重)

    苹果xs发热怎么办(iphone xs发热严重)

  • diagent.exe是什么进程  diagent进程有什么作用(dghm.exe是什么程序)

    diagent.exe是什么进程 diagent进程有什么作用(dghm.exe是什么程序)

  • 【路径规划】A*算法方法改进思路简析(路径规划原理)

    【路径规划】A*算法方法改进思路简析(路径规划原理)

  • 公司的纳税人识别号怎么查询
  • 企业购入汽车可以抵扣增值税吗
  • 企业罚职工的钱违法吗?
  • 教育培训行业是干什么的
  • 经营所得税投资者减除费用
  • 事务所和公司的专利工程师
  • 什么是资金账簿印花税
  • 个体工商户年度报告表怎么报
  • 工资薪金所得应纳税所得额
  • 旅游开发公司有什么职位
  • 存货换入无形资产考虑增值税
  • 个体工商户的生产、经营所得
  • 应付票据与应付账款
  • 增值税普通发票查询真伪
  • 商贸企业可以使用月末一次加权平均
  • 挂靠费如何纳税?
  • 修理费要开税控清单吗
  • 促销费属于哪个税目
  • 住宿业的配套服务有哪些
  • 员工工伤单位垫付
  • 应交增值税为负数代表什么
  • 金三接口调用失败怎么办?
  • 远期外汇合约套期会计分录
  • 出租包装物和出借包装物的摊销额
  • 单位应当为职工创造有益于健康的环境和条件
  • windows10如何设置密码
  • word表格跨页设置
  • 如何删除驱动器里面的文件
  • PHP:mb_encode_numericentity()的用法_mbstring函数
  • 病毒变种太多
  • aspnet_admin.exe进程是安全的吗 aspnet_admin进程信息查询
  • php实现的链式队列是什么
  • 资产负债表中各项目的期末余额
  • metric命令
  • 税额抵减情况表和减免税申报表
  • phpcms是什么意思
  • 事业单位应当按月对固定资产计提折旧
  • 学电脑网站
  • 财政拨款结余明细科目编码
  • 商品进销差价是流动资产吗
  • 差旅费计入工资合理吗
  • java连接mysql数据库
  • 或有资产的确认条件基本确定
  • 母子公司关联交易规定
  • 年终奖可以税前扣除吗
  • 置换的房产如何操作
  • 购买税控系统的增值税怎么处理
  • 检测费可以抵扣吗
  • 只有发票没有银行回单怎么做账
  • 企业购入材料收到供货单位开具的发票
  • 明细账怎么订起来
  • 数据库alter change
  • sql server中的权限包括哪三种类型
  • macbook macos
  • watch programmes
  • windows10电脑重置电脑
  • Fedora 13 Final DVD ISO系统下载
  • U盘安装ubuntu的分区详细教程
  • linux系统中用户可以分为三种
  • soffice.exe - soffice进程是什么意思 有什么用
  • Win7系统如何查看隐藏文件
  • Win10 Mobile build 10586.338安装/上手体验视频
  • win10重置系统快捷键
  • win8开机启动项
  • js插件大全
  • 记住密码自动登录 会更新登陆信息吗
  • linux命令shell脚本
  • jquery插件怎么用到自己的网站
  • android adbd
  • shell 递归
  • sed基本用法
  • python脚本代码大全
  • 主机端口扫描程序设计python
  • python 函数 星号参数
  • 北京税务局网站
  • 农业方面有哪些专业
  • 国税局黑龙江省
  • 360浏览器hi真不巧
  • 河北地税网上申报纳税
  • 2021年税务高雅春联带横批
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设