位置: 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)

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

  • 手机端腾讯视频怎么投屏(手机端腾讯视频二维码登录)

    手机端腾讯视频怎么投屏(手机端腾讯视频二维码登录)

  • 小红书怎么拉黑别人(小红书怎么拉黑对方)

    小红书怎么拉黑别人(小红书怎么拉黑对方)

  • 淘宝app怎么看等级(淘宝app如何查看淘宝等级)

    淘宝app怎么看等级(淘宝app如何查看淘宝等级)

  • 搜狗输入法朋友圈模式不能用了(搜狗输入法朋友圈不折叠)

    搜狗输入法朋友圈模式不能用了(搜狗输入法朋友圈不折叠)

  • 快影导出失败怎么回事(快影导出失败怎么办)

    快影导出失败怎么回事(快影导出失败怎么办)

  • 淘宝淘气值是什么(淘宝的淘气值是什么意思如何获得)

    淘宝淘气值是什么(淘宝的淘气值是什么意思如何获得)

  • vivo简单截屏方法(vivo截屏操作)

    vivo简单截屏方法(vivo截屏操作)

  • osi和tcpip的区别和联系(osi与tcpip协议的联系和区别)

    osi和tcpip的区别和联系(osi与tcpip协议的联系和区别)

  • 抖音剪映怎么剪辑掉多余片段(抖音剪映怎么剪辑视频教程)

    抖音剪映怎么剪辑掉多余片段(抖音剪映怎么剪辑视频教程)

  • 苹果哪些是双卡双待(苹果哪些是双卡双待5G)

    苹果哪些是双卡双待(苹果哪些是双卡双待5G)

  • kindle是什么系统(kindle是哪种格式)

    kindle是什么系统(kindle是哪种格式)

  • 居中快捷键ctrl加什么(居中快捷键 word)

    居中快捷键ctrl加什么(居中快捷键 word)

  • 韩众平板是哪个公司生产的(韩众平板是哪个公司的)

    韩众平板是哪个公司生产的(韩众平板是哪个公司的)

  • 微信怎么成批删除好友(微信怎么成批删除聊天痕迹)

    微信怎么成批删除好友(微信怎么成批删除聊天痕迹)

  • 表示存储空间大小的最基本单位(表示存储空间大小的基本单位)

    表示存储空间大小的最基本单位(表示存储空间大小的基本单位)

  • 华为怎么卸载系统软件(华为怎么卸载系统浏览器)

    华为怎么卸载系统软件(华为怎么卸载系统浏览器)

  • 手机怎么发链接(手机怎么制作链接)

    手机怎么发链接(手机怎么制作链接)

  • 哈罗助力车自动充电吗(哈罗助力车自动扣费)

    哈罗助力车自动充电吗(哈罗助力车自动扣费)

  • 米读小说能缓存吗(米读缓存的章节怎么删除)

    米读小说能缓存吗(米读缓存的章节怎么删除)

  • 微信朋友圈一条横线是什么意思(微信朋友圈一条横线,但是可以发消息)

    微信朋友圈一条横线是什么意思(微信朋友圈一条横线,但是可以发消息)

  • 陌陌怎么不可以视频了(陌陌怎么不可以评论别人)

    陌陌怎么不可以视频了(陌陌怎么不可以评论别人)

  • vivos1有没有人脸解锁(vivos1手机有没有人脸识别功能)

    vivos1有没有人脸解锁(vivos1手机有没有人脸识别功能)

  • 华为nova4充电器型号(华为nova4充电器型号对应表)

    华为nova4充电器型号(华为nova4充电器型号对应表)

  • 网上订汽车票怎么订(网上订汽车票怎么改签)

    网上订汽车票怎么订(网上订汽车票怎么改签)

  • AI 代码生成工具 Cursor 安装和使用介绍大全(ai自动生成代码)

    AI 代码生成工具 Cursor 安装和使用介绍大全(ai自动生成代码)

  • vue 路由跳转携带参数(vue路由跳转携带参数怎么接收)

    vue 路由跳转携带参数(vue路由跳转携带参数怎么接收)

  • 居民个人取得境内、境外所得,如何计算应纳税额?
  • 一般纳税人增值税会计账务处理
  • 纸质发票红冲操作流程
  • 电子税务局利润表本期金额
  • 公司给员工报销话费怎么做账
  • 怎样进行房产置换的账务处理
  • 无形资产摊销是谨慎性原则吗
  • 公司单独核算项目财务怎么处理?
  • 冲销去年暂估费用
  • 公户转到法人账户怎么做账
  • 建筑业统一发票可以抵扣吗
  • 买车的保险可以砍价吗
  • 税务机关是否可以申请破产清算
  • 湖北省教育费附加和地方教育费附加减免
  • 发票专用章能刻章吗
  • 支付给供应商的现金属于什么活动
  • 小型微利企业的条件
  • 财产清查中固定资产盘亏
  • 正常工资薪金本期收入含哪些
  • 本年利润余额负数表示什么意思
  • 地方教育费附加的会计分录
  • 控股子公司利润并表
  • 如何在Excel中添加筛选项
  • 收支两条线是指
  • realtek自动安装
  • 存出投资款要计入现金流吗
  • 金融负债的范围
  • php实现的链式队列是什么
  • 经营出租的固定资产折旧计入哪里
  • 购买低值易耗品现金流量计入
  • 小企业会计准则调整以前年度费用分录
  • 技术维护费计入
  • 母子公司吸收合并税务处理
  • 出口企业要缴纳印花税吗
  • 全连接神经网络是什么意思
  • Python深度学习实战:人脸关键点(15点)检测pytorch实现
  • 小规模申报增值税减免税申报明细表
  • 防伪税控技术服务费订单号怎么查
  • 进项税抵增值税
  • 自收自支是由主管部门拨款吗
  • web cms漏洞
  • python3矩阵求逆
  • 收到预付款怎么入账
  • mongodb morphia
  • 无形资产收益额的具体测算方法有
  • 买一赠一税务局答复
  • 债务重组损失计入什么科目2020
  • 为外单位人员报备流程
  • 福利费列支的个税怎么算
  • 计算税前利润时 是否考虑资金成本
  • 公司 股东 变更
  • 未分配利润太多的危害
  • 新注册的公司在企查查上查不到
  • 股份有限公司股东人数
  • 进项税转出怎样做账务处理
  • 加油的增值税发票几个点
  • 银行现金支票作废处理步骤
  • 其他应收账款的会计分录
  • 公允价值变动损益借贷方向
  • 预交企业所得税税率
  • 房地产开发企业开发成本包括哪些项目
  • sqlserver自动生成id
  • sqlserver存储过程返回多个结果集
  • win7怎么添加设备
  • 局域网 下载
  • windowsxp自带播放器
  • ubuntu20开机自启动
  • mac系统怎么删除用户
  • linux用户账户管理
  • fdb是什么文件
  • linux命令su-
  • win7打开回收站
  • cocos2dx 教程
  • cocos2048
  • 文本框几种常用属性
  • 置顶高手
  • 郑州市高新区税务局地址
  • 公办幼儿园和企办幼儿园区别
  • 智能财税代理实务实训过程
  • 国税合并地税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设