el-menu根据多层树形结构递归遍历展示菜单栏

news/2024/9/8 12:37:09

文章目录

  • 前提条件
  • 假设菜单等级只有两个等级
    • 结果如下所示
  • 但是如果菜单等级超过两个等级或者多个等级的话
    • App.vue
    • MenuItems.vue
    • 结果如下所示
  • 关于遍历时图标前的展示后续完善
  • 关于点击路由跳转参考element plus的官网即可

前提条件

package.json如下所示,这是一个Vite + Vue3 + TS的项目

{"name": "vue3-ts-vite-wen-zhang-ji-lu-xiang-mu","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite","build": "vue-tsc && vite build","preview": "vite preview"},"dependencies": {"element-plus": "^2.4.2","vue": "^3.3.4"},"devDependencies": {"@vitejs/plugin-vue": "^4.2.3","sass": "^1.69.5","typescript": "^5.0.2","vite": "^4.4.5","vue-tsc": "^1.8.5"}
}

下面为了方便,直接在App.vue组件中,代码结构如下所示,就一纯净项目,然后直接在App.vue中写代码
在这里插入图片描述

假设菜单等级只有两个等级

如果菜单等级只有两个等级,那就没有必要使用到递归了,直接遍历,然后根据是否有children字段,判断是一级菜单还是二级菜单就可以了。具体代码如下所示:

<template><div style="width: 100%; height: 100%;"><div class="common-layout"><el-container><el-header>头部</el-header><el-container><!-- 侧边栏区域 --><el-aside width="200px"><el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"><template v-for="(item, index) in menuList" :key="index"><el-sub-menu :index="item.path" v-if="item.children && item.children.length"><template #title><el-icon><location /></el-icon><span>{{ item.name }}</span></template><el-menu-item v-for="child in item.children" :key="child.id" :index="child.path">{{ child.name }}</el-menu-item></el-sub-menu><el-menu-item v-else :index="item.path"><el-icon><setting /></el-icon><span>{{ item.name }}</span></el-menu-item></template></el-menu></el-aside><!-- 主题区域 --><el-main>这是主题区域</el-main></el-container></el-container></div></div>
</template><script setup lang="ts">
import { ref } from 'vue'
import { Location, Setting } from '@element-plus/icons-vue'interface MenuItem {id: number;name: string;path: string;icon?: string;component?: string;children?: MenuItem[];
}const menuList = ref<MenuItem[]>([{id: 1,name: '首页',path: '/',icon: 'location',component: 'home',children: []},{id: 2,name: '用户管理',path: '/user',icon: 'location',component: 'user',children: [{id: 3,name: '用户列表',path: 'list',icon: '',component: 'userList',children: []},{id: 5,name: '角色列表',path: 'roleList',icon: '',component: 'userList',children: []}]},{id: 6,name: '权限管理',path: '/permission',icon: 'setting',component: 'permission',children: [{id: 7,name: '权限列表',path: 'permissionList',icon: '',component: 'permissionList',}]}]
)const handleOpen = (key: string, keyPath: string[]) => {console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {console.log(key, keyPath)
}</script><style scoped lang="scss">
.el-container {width: 100%;height: 100%;
}
</style>

结果如下所示

在这里插入图片描述

但是如果菜单等级超过两个等级或者多个等级的话

但是如果菜单等级超过两个等级或者多个等级的话,这时就可以使用到组件递归的方式进行了。目录结构如下所示:
在这里插入图片描述

App.vue

<template><div style="width: 100%; height: 100%;"><div class="common-layout"><el-container><el-header>头部</el-header><el-container><!-- 侧边栏区域 --><el-aside width="200px"><el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"><menu-items :items="menuList"></menu-items></el-menu></el-aside><!-- 主题区域 --><el-main>这是主题区域</el-main></el-container></el-container></div></div>
</template><script setup lang="ts">
import { ref } from 'vue'
import MenuItems from './components/MenuItems.vue'interface MenuItem {id: number;name: string;path: string;icon?: string;component?: string;children?: MenuItem[];
}const menuList = ref<MenuItem[]>([{id: 1,name: '首页',path: '/',icon: 'location',component: 'home',children: []},{id: 2,name: '用户管理',path: '/user',icon: 'location',component: 'user',children: [{id: 3,name: '用户列表',path: 'list',icon: '',component: 'userList',children: [{id: 4,name: '用户详情',path: 'userDetail',icon: '',component: 'userDetail',children: []}]},{id: 5,name: '角色列表',path: 'roleList',icon: '',component: 'userList',children: []}]},{id: 6,name: '权限管理',path: '/permission',icon: 'setting',component: 'permission',children: [{id: 7,name: '权限列表',path: 'permissionList',icon: '',component: 'permissionList',children: [{id: 8,name: '权限详情-1',path: 'permissionDetail',icon: '',component: 'permissionDetail',children: [{id: 9,name: '权限详情-2',path: 'permissionDetail2',icon: '',component: 'permissionDetail2',children: []}]}]}]}]
)const handleOpen = (key: string, keyPath: string[]) => {console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {console.log(key, keyPath)
}</script><style scoped lang="scss">
.el-container {width: 100%;height: 100%;
}
</style>

MenuItems.vue

<template><template v-for="item in items" :key="item.id"><el-sub-menu v-if="item.children && item.children.length > 0" :index="item.path"><template #title><span>{{ item.name }}</span></template><!-- 递归遍历 --><menu-items :items="item.children" /></el-sub-menu><el-menu-item v-else :index="item.path"><span>{{ item.name }}</span></el-menu-item></template>
</template><script setup lang="ts">
interface MenuItem {id: number;name: string;path: string;icon?: string;component?: string;children?: MenuItem[];
}
defineProps<{items: MenuItem[];
}>()
</script>

结果如下所示

在这里插入图片描述
从图中可以看出,无论是一层,二层,三层,四层结构的树形数据,都可以在el-menu中展示。

关于遍历时图标前的展示后续完善

关于点击路由跳转参考element plus的官网即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/14945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】条件变量及生产者消费者模型

为什么要将这两者放在一起进行呢&#xff1f; 主要是因为生产消费与条件变量关系密切&#xff0c;正好相辅相成。 目录 条件变量&#xff1a;条件变量的引出&#xff1a;条件变量的解释与接口&#xff1a;测试代码&#xff1a; 生产者消费者模型&#xff1a;概念&#xff1a;代…

Mindspore框架循环神经网络RNN模型实现情感分类|(二)词向量

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

德国云手机:企业移动办公解决方案

在现代商业环境中&#xff0c;移动办公已经成为一种趋势。德国云手机作为一种高效的解决方案&#xff0c;为企业提供了强大的支持。本文将探讨德国云手机如何优化企业的移动办公环境。 一、德国云手机的主要优势 高灵活性 德国云手机具有高度的灵活性&#xff0c;能够根据用户需…

vue elementui 上传视频 以及上传视频失败重新上传没反应的处理方法

<template><el-drawertitle"上传视频"size"50%":visible.sync"drawer":direction"direction"><div class"content"><div class"upload-box" v-if"!secondStep"><!--on-exce…

uniapp手写滚动选择器

文章目录 效果展示HTML/Template部分&#xff1a;JavaScript部分&#xff1a;CSS部分&#xff1a;完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能&#xff0c;可以选择小时和分钟&#xff1a; HTML/Template部分&#xff1a; <picker…

企业获客重要途径-大数据获客系统

企业获客的重要途径之一是通过大数据获客系统。这一系统利用大数据技术和分析方法&#xff0c;帮助企业更精准地获取客户&#xff0c;提高市场营销的效率和效果。 所以整理了以下是大数据获客系统作为企业获客重要途径的详细阐述&#xff1a; 一、大数据获客系统的定义与功能…