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

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

  • 计提并结转所得税分录
  • 增值税加计抵减的行业
  • 本年利润和利润分配未分配利润的区别
  • 银行进账单票据号码在哪里
  • 在公司交社保不满十年,女性按照什么退税
  • 销售煤炭增值税怎么算
  • 行政事业性收据上面的角分无是右下划线吗
  • 特许权使用费计算公式
  • 试驾车抵税
  • 施工企业结算金额怎么算
  • 以前年度损益调整属于哪类科目
  • 促销赠品的会计处理
  • 传媒公司的成本构成有哪些
  • 工资分两次发为什么分两次扣税?
  • 工程款增值税专用发票如何开具
  • 未达起征点销售额和其他免税销售额
  • 旅游业差额的会计分录
  • 电商刷单支付的佣金会计分录
  • 工程哪些材料可以做
  • 资本公积可以退还给投资者吗
  • 装饰公司发票怎么
  • 小规模纳税人买车可以抵税吗
  • 什么货物出口最多
  • 房地产转让的条件
  • PHP:oci_set_prefetch()的用法_Oracle函数
  • php部署在什么服务器
  • php密码加密和解密
  • 预计负债内容
  • 其他暂收应付款项有哪些
  • 既征收消费税又征收增值税的是
  • 下列可以作为企业使命
  • 多交税款的退还
  • 小企业会计准则
  • 增值税专用发票丢了怎么补救
  • 以前年度损益调整
  • 采购折让分录
  • Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。
  • vue watch和computed
  • 数据库arc文件
  • 预计负债初始计量的最佳估计数的确定是会计估计变更吗
  • python中如何创建一个对象
  • python的继承用法
  • 地价计入房产原值文件解读
  • 财务负责人需要承担什么风险
  • 资产负债表怎么算
  • 财产租赁合同按金额的多少进行计税
  • php怎么连接sqlserver
  • 劳务报酬和工资薪金有什么区别
  • 旅行社开具的发票可以作为福利费税前支出吗
  • 对于产品开发阶段的评价
  • 费用报销单一张写不完怎样转下一张?
  • 进项转出的原因是什么
  • 给客户减免的货款怎么做账
  • 税金及附加科目核算
  • 排序mysql
  • win8蓝屏代码大全
  • fedora os
  • u盘怎么设置速度快
  • centos内存占用进程
  • linux系统干嘛的
  • 工商网银登陆
  • windows7开机
  • win7免费升级永久win8
  • nodejs常用api
  • IE6,IE7和firefox对DIV的支持区别
  • node.js怎么学
  • android-3
  • ftp远程桌面
  • python中requests小技巧
  • js获取表单元素
  • 在windows下搭建snort和base
  • python如何做网站
  • python入门100例
  • android 自定义
  • 南京电子税务局咨询电话
  • 土地增值税清算时间要求
  • 新疆税务app操作手册
  • 北京税务局地税电话
  • 简述会计估计及其特点
  • 海口市哪个地方最漂亮
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设