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

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

  • 0x00004005无法连接到打印机(0x00004005无法连接到打印机win10)

    0x00004005无法连接到打印机(0x00004005无法连接到打印机win10)

  • 荣耀20Pro充电提示音在哪里设置(荣耀20Pro充电提示都有几种)

    荣耀20Pro充电提示音在哪里设置(荣耀20Pro充电提示都有几种)

  • vivox27拍照模糊(vivox27拍照模糊怎么办)

    vivox27拍照模糊(vivox27拍照模糊怎么办)

  • 红米note8pro nfc感应区在哪(redmi note 8 pro nfc)

    红米note8pro nfc感应区在哪(redmi note 8 pro nfc)

  • 显示器的线是插在主板上还是显卡上(显示器的线是插上去的吗)

    显示器的线是插在主板上还是显卡上(显示器的线是插上去的吗)

  • xr通话中断解决方法(xr打电话老是断线)

    xr通话中断解决方法(xr打电话老是断线)

  • 请进入pc版卖家页面处理是什么意思(建议您进入pc版卖家中心)

    请进入pc版卖家页面处理是什么意思(建议您进入pc版卖家中心)

  • 电脑只显示图标没有字(电脑只显示图标打不开)

    电脑只显示图标没有字(电脑只显示图标打不开)

  • 静音模式关是什么意思(静音模式关不掉怎么办)

    静音模式关是什么意思(静音模式关不掉怎么办)

  • anc主动降噪什么意思(主动降噪anc enc)

    anc主动降噪什么意思(主动降噪anc enc)

  • 钉钉开启横屏模式是什么意思(钉钉开启横屏模式 视频会议还是竖着的)

    钉钉开启横屏模式是什么意思(钉钉开启横屏模式 视频会议还是竖着的)

  • 投影仪耗电量大吗(投影仪耗电量大还是电视)

    投影仪耗电量大吗(投影仪耗电量大还是电视)

  • 台式电脑上不了网(台式电脑上不了网是什么原因)

    台式电脑上不了网(台式电脑上不了网是什么原因)

  • 笔记本长时间充电有影响吗(笔记本长时间充电使用有什么影响)

    笔记本长时间充电有影响吗(笔记本长时间充电使用有什么影响)

  • 待成团是什么意思(成团在即什么意思)

    待成团是什么意思(成团在即什么意思)

  • 10mbps是几兆(10Mbps是几兆宽带)

    10mbps是几兆(10Mbps是几兆宽带)

  • 苹果8plus支持电信卡吗(苹果7为什么充不了电)

    苹果8plus支持电信卡吗(苹果7为什么充不了电)

  • oppo互传在哪打开(oppo互传在哪开启)

    oppo互传在哪打开(oppo互传在哪开启)

  • 怎么把图片弄成嵌入式(怎么把图片弄成一个文件)

    怎么把图片弄成嵌入式(怎么把图片弄成一个文件)

  • 怎样在手机上看电视节目(怎样在手机上看自己的车停哪了)

    怎样在手机上看电视节目(怎样在手机上看自己的车停哪了)

  • soul关注后怎么聊天(soul关注了怎么进对方聊天室)

    soul关注后怎么聊天(soul关注了怎么进对方聊天室)

  • airpods拆封了还能退吗(airpodspro已拆封)

    airpods拆封了还能退吗(airpodspro已拆封)

  • 华为mate30pro是不是5g手机(华为mate30pro1)

    华为mate30pro是不是5g手机(华为mate30pro1)

  • cpu液金多久换一次(cpu更换过液金为什么不收)

    cpu液金多久换一次(cpu更换过液金为什么不收)

  • 5g如何改变生活(5g如何改变生活阅读答案)

    5g如何改变生活(5g如何改变生活阅读答案)

  • 芒果vip怎么取消续费(芒果vip怎么取消连续包月)

    芒果vip怎么取消续费(芒果vip怎么取消连续包月)

  • 公司买房子可以贷款多少
  • 非税缴税是什么意思
  • 专票现金支付规定
  • 专利没有资本化成本如何入账
  • 残保金在职职工人数临时工算吗
  • 自然人纳税人识别号查询
  • 小规模纳税人购车好处
  • 预缴增值税是否要预缴印花税
  • 一般纳税人开培训发票税率是多少
  • 金税盘和税控盘和ukey
  • 小规模开票后的分录怎么做
  • 小规模纳税人领发票要带什么
  • 存货折扣怎样做账
  • 支付水电费如何记账
  • 危废处置怎么收费
  • 未担保余值什么意思
  • 动产抵押交付生效还是登记生效
  • 电子承兑汇票怎么用
  • 几种方法解决一个问题的架构图怎么画
  • 企业自建自用房的规定
  • PHP:pg_connection_reset()的用法_PostgreSQL函数
  • 交易性金融资本
  • 国家税务总局关于个人因解除劳动合同
  • 应收票据到期后账务处理
  • 新办公司实收资本怎么查
  • php延迟静态绑定
  • php传值给js
  • 代收资金清算过期怎么办
  • 公司客户招待费用标准
  • 治疗孩子咳嗽小秘方,超实用
  • 什么叫非侵入性装置
  • 前端高手
  • 终止cat命令
  • thinkphp官网
  • 实现php搜索框代码
  • 预收账款未发货会计分录
  • python搞自动化
  • 工业企业变压器容量费用
  • 按月申报的税种
  • 织梦栏目页模板
  • phpcms模板下载
  • 织梦怎么建站
  • 被盗的固定资产如何处理
  • 补计提个税分录
  • 转出未交增值税最终怎么转平
  • 购买商标入账
  • 全国通用机打销售票真伪
  • 不抵扣勾选是什么
  • 财务会计报表的使用者有哪些
  • 筹建期间的开办费属于资产吗
  • 建筑工程人工费包括哪些内容
  • 律师事务所账务处理例题
  • 零申报企业年报资产状况信息怎么填
  • 增值税留抵税额借贷方向
  • 增值税普通发票可以抵扣吗
  • 工程项目必须购买保险吗
  • 其他应付款在借方表示什么
  • 公司分红怎么做账
  • 什么计提折旧不能转回
  • mysql sql行转列
  • 虚拟机增加磁盘选择物理磁盘分区
  • linux文本处理实验报告
  • mini programes
  • Win7系统无法安装SQL2000
  • linux防火墙的主要内容
  • windows 8/10whql
  • win7开机无法连接所有网络驱动器
  • 怎么免费升级win10系统
  • 微软 系统设计
  • javascript中的函数
  • js链式编程的原理
  • unity 替代
  • Unity3d MonoDevelop格式化代码
  • shell脚本怎么写循环
  • 在其他地方 英文
  • shell脚本实现监控进程
  • 对xmlHttp对象方法和属性的理解
  • 税控盘连接服务器失败是什么原因黑盘发票无法上传
  • 税法 农产品增值税题目及答案
  • 青岛市医保网上办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设