当前位置: 首页 > news >正文

14、springboot3 vue3开发平台-前端-自定义菜单组件,根据路由动态渲染

文章目录

  • 1. 组件
  • 2 . 使用示例

1. 组件

src\components\menuTree\index.vue

<template><template v-for="item in menuList"><!-- 分为两种方式渲染:有子菜单和没有子菜单--><!--      没有子菜单--><el-menu-item :index="item.path" v-if="item.children.length == 0" :key="item.path"@click="handleRouter(item)"><el-icon v-if="item.icon"><svg-icon slot="prefix" :name="item.icon" width="18px" height="18px" /></el-icon><span>{{ item.menuName }}</span></el-menu-item><el-sub-menu :index="item.path" v-if="item?.children?.length > 0" ><template #title><el-icon v-if="item.icon"><svg-icon slot="prefix" :name="item.icon" width="18px" height="18px" /></el-icon><span @click="handleSubMenu($event, item)">{{ item.menuName }}</span></template><!--        有子菜单的继续遍历(递归)--><MenuTree :menuList="item.children" ></MenuTree></el-sub-menu></template>
</template>
<script setup lang="ts" >
// 声明 props - 对象格式  在script 中不使用props拿不到数据, <template>中自动解构const props = defineProps({menuList: Array<any>
})// 定义要触发的事件  
const emit = defineEmits(['childEvent'])// 切换路由
const handleRouter = (menu: any) => {emit('childEvent', { type: 'menuItem', item: menu })
}// 目录被点击
const handleSubMenu = (event: Event, menu: any) => {let event1 = event.currentTargetlet event2 = event.targetif (event1 == event2) {emit('childEvent', { type: 'subMenu', item: menu })}
}</script>
<script>
export default {name: "MenuTree"
}
</script>

注1: 组件自递归要使用时要导出
注2: 这里使用的图标是之前自定义的图标组件

<script>
export default {name: "MenuTree"
}
</script>

2 . 使用示例

在父组件中:

<MenuTree :menuList="menuList" @childEvent="handChildEvent"></MenuTree>// 获取pinia的缓存的菜单数据, 这里数据来源根据自己实际来获取
const menuList = menuStore.menuList// 子组件事件逻辑根据实际来定义
const handChildEvent = (data: any) => {let menu = data.itemif (data.type == 'menuItem') {// 向tabList中添加数据,检查是否已经添加  数据结构:{title:'首页',path:'/index'}let hasNode = menuStore.tabList.filter((item: any) => item.path == menu.path)if (hasNode == null || hasNode.length == 0) {let data = { title: menu.menuName, path: menu.path, id: menu.id, menuName: menu.menuName, parentId: menu.parentId }menuStore.setTabList(data)}// 修改activeTab的值menuStore.setActive(menu.path)// 缓存面包屑数据menuStore.addBreadList(menu)} if (data.type == 'subMenu') {menuStore.addBreadList(menu)}
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何保证Redis缓存和数据库的数据一致性
  • Redmi 13C 5G 红米13R 5G 解锁BL 降级 MIUI 秒解锁BL 澎湃OS 降级
  • 8-5 循环神经网络 RNN 的实现
  • 利用java结合python实现gis在线绘图,主要技术java+python+matlab+idw+Kriging
  • 【JAVA基础】从内部类引用的局部变量必须是final或有效的final
  • 86.小米相机修改拍照(尺寸,画幅,比例)的方法
  • SAP B1系统设置和管理——数据所有权权限
  • 技术革新!MultiDesk:高效远程桌面管理工具,TAB切换引领新潮流!
  • 24/8/18算法笔记 MARL多智能体算法
  • 【免费】企业级大模型应用推荐:星环科技无涯·问知
  • 解决firefly rk3399使用ffmpeg硬解码rga报错的问题
  • PHP中如何将变量从函数传递给acf_add_filter
  • Golang基于DTM的分布式事务SAGA实战
  • 微前端架构:使用不同框架构建可扩展的大型应用
  • 【生成式人工智能-十一一个不修改模型就能加速语言模型生成的方法】
  • 深入了解以太坊
  • [deviceone开发]-do_Webview的基本示例
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Asm.js的简单介绍
  • bootstrap创建登录注册页面
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • github从入门到放弃(1)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript创建对象的四种方式
  • Laravel Mix运行时关于es2015报错解决方案
  • learning koa2.x
  • leetcode98. Validate Binary Search Tree
  • Lsb图片隐写
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue:响应原理
  • VuePress 静态网站生成
  • Webpack 4x 之路 ( 四 )
  • 高度不固定时垂直居中
  • 将回调地狱按在地上摩擦的Promise
  • 前端临床手札——文件上传
  • 使用putty远程连接linux
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • $refs 、$nextTic、动态组件、name的使用
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (3) cmake编译多个cpp文件
  • (C)一些题4
  • (MATLAB)第五章-矩阵运算
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .gitignore不生效的解决方案
  • .net 4.0发布后不能正常显示图片问题