vue3+element-plus 实现动态菜单和动态路由的渲染
在 Vue.js 中,使用 Vue Router 管理路由数据,并将其用于渲染 el-menu(Element UI 的菜单组件)通常涉及以下几个步骤:
-  
定义路由元数据:
在你的路由配置中,为每个路由项添加meta字段,这个字段可以包含任何你想要传递给菜单的数据,例如菜单名称、图标等。 -  
获取路由数据:
使用router实例的getRoutes()方法来获取当前注册的所有路由信息。 -  
过滤和格式化数据:
根据需要过滤和格式化路由数据,以便它们可以被el-menu组件使用。 -  
将数据传递给组件:
将格式化好的路由数据传递给使用el-menu的组件。 -  
使用 v-for 渲染菜单:
在组件的模板中,使用v-for指令来遍历路由数据,并渲染el-menu。 
实现效果

路由配置
首先是路由配置,要实现这个路由配置,你需要完成以下几个步骤:
-  
注册 Vue Router:确保你已经在你的 Vue 应用中安装并注册了 Vue Router。
 -  
定义路由:使用 Vue Router 的
addRoute方法动态添加路由。 -  
使用路由:在应用中使用
<router-view>来渲染对应的组件。 -  
渲染菜单:如果你需要根据路由配置动态渲染菜单(例如使用 Element UI 的
el-menu),你需要从路由配置中提取必要的信息。 
下面是一个基本的实现示例:
main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router'; // 假设你有一个 router 文件const app = createApp(App);app.use(router).mount('#app');
 
router.js
import { createRouter, createWebHistory } from 'vue-router';
import Main from '../views/Main.vue';
import Home from '../views/Home.vue';
import Goods from '../views/goods.vue';
import Order from '../views/order.vue';const routes = [{path: '/',name: 'main',component: Main,children: [{path: 'home',name: 'home',component: Home,meta: { title: '主页', icon: 'house' },},{path: 'goods',name: 'Goods',component: Goods,meta: { title: '商品列表', icon: 'el-icon-shopping-cart-full' },},{path: 'order',name: 'Order',redirect: 'order/table',children: [{path: 'table',name: 'Table',component: Order,meta: { title: '订单列表', icon: 'el-icon-s-fold' },},],meta: { title: '订单', icon: 'el-icon-s-claim' },},],},
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,
});export default router;
 
App.vue
<template><div id="app"><router-view></router-view></div>
</template><script>
export default {name: 'App',
};
</script>
 
动态渲染菜单
如果你想根据路由配置动态渲染菜单(el-menu),你可以在组件中使用 Vue Router 的 routes 属性。以下是一个使用组合式 API 的示例:
MenuComponent.vue
<template><el-aside :width="width"><el-menubackground-color="#fff"active-text-color="#409eff"class="aside-menu":collapse="isCollapse":default-active="activeMenu"><el-menu-item v-for="item in noChilden":index="item.path":key="item.path"@click="handlemenu(item)"><component class="icon" :is="item.meta.icon"></component><span>{{ item.meta.title }}</span>        </el-menu-item><el-sub-menu v-for="item in hasChilden":index="item.path":key="item.path"><template #title><component class="icon" :is="item.meta.icon"></component><span>{{ item.meta.title }}</span></template><!-- <el-menu-item-group> --><el-menu-item v-for="subItem in item.children":key="subItem.path":index="subItem.path"@click="handlemenuchild(item,subItem)"class="sub-menu-deep"><component class="icon" :is="subItem.meta.icon"></component><span>{{ subItem.meta.title }}</span></el-menu-item><!-- </el-menu-item-group> --></el-sub-menu></el-menu></el-aside>
</template><script setup>import {ref,computed,onMounted} from 'vue'
import {useAllDataStore} from "@/store"
import {useRouter,useRoute} from 'vue-router'const list = ref([]);
const router = useRouter();
onMounted(() =>{
//找到根路由
const childRoutes = router.getRoutes().find(route => route.path === '/').children; list.value = childRoutes.filter(route => route.meta && route.meta.title);
console.log(list.value);
});
const hasChilden = computed(() => list.value.filter(item => item.children && item.children.length > 0))
const noChilden = computed(() => list.value.filter(item => !item.children || item.children.length === 0))const route = useRoute()
const handlemenu = (item) =>{router.push(item.path)}
const handlemenuchild = (item,subItem) =>{router.push(item.path+'/'+ subItem.path)
}
const activeMenu = computed(() => route.path)
</script><style lang="less" scoped>
.icon{width:18px;height: 18px;margin-right: 5px;
}
.el-menu {border-right: none;font-size: 20px;font-weight: bold;h3{line-height: 48px;text-align: center;}
}
.el-aside{height:100%;background-color: #fff;// box-shadow: 1px 0px 5px rgba(0, 0, 0, 0.2);border-right: 1px solid #e4e7ed;
}</style>解释上面是怎么实现router 动态渲染菜单的
 
这段代码是一个使用 Vue 3 和 Element UI 库实现的侧边导航菜单组件,它通过 Vue Router 的路由信息动态渲染菜单项。下面是代码的详细解释:
布局中引入组件
<script setup>
import CommonAside from '@/components/.vue'
import CommonHeader from '../components/MenuComponent.vue';
import CommonTab from '@/components/CommonTab.vue'
</script><template><div class="common-layput"><el-container class="lay-container"><!-- 自定义左侧菜单组件 --><menu-component /><el-container><el-header class="el-header"><common-header /></el-header><el-main class="right-mian"><!-- 路由显示内容 --><router-view></router-view></el-main></el-container></el-container></div>
</template><style scoped lang="less">.common-layput,.lay-container{height:100%;}.el-header{background-color: #fff;box-shadow: 1px 0px 5px rgba(0, 0, 0, 0.2);}
</style>
 
模板部分 (<template>)
 
- 使用 
el-aside组件作为侧边栏容器。 el-menu组件用于创建菜单,其中:background-color和active-text-color设置菜单的背景色和激活项的文字颜色。class添加自定义类名。:collapse属性用于控制菜单的展开和收起状态。:default-active绑定当前激活的菜单项路径。
菜单项和子菜单项渲染
- 使用 
el-menu-item组件渲染没有子菜单的顶级菜单项。 - 使用 
el-sub-menu组件渲染带有子菜单的菜单项。 
脚本部分 (<script setup>)
 
- 引入必要的 Vue 组合式 API 钩子:
ref,computed,onMounted,useRouter,useRoute。 list引用用于存储从 Vue Router 获取的路由信息。
路由信息获取
- 在 
onMounted钩子中,使用useRouter钩子的getRoutes方法找到根路由'/'的子路由,并筛选出包含meta和meta.title的路由,存储到list.value。 
计算属性
hasChilden:计算属性,筛选出list.value中具有子菜单的路由。noChilden:计算属性,筛选出list.value中没有子菜单的路由。
导航处理函数
handlemenu:处理无子菜单项的点击事件,使用router.push方法导航到点击的菜单项路径。handlemenuchild:处理有子菜单项的点击事件,拼接父菜单和子菜单的路径,然后导航。
激活状态
activeMenu:计算属性,根据当前路由的路径route.path设置激活的菜单项。
样式部分 (<style>)
 
- 定义了一些基本的样式来美化菜单,例如移除边框、设置字体大小和加粗。
 
总结
这个组件通过 Vue Router 的 useRouter 钩子获取当前路由的配置信息,并根据这些信息动态生成菜单项。使用 computed 属性来区分哪些路由有子菜单,哪些没有,然后相应地渲染 el-menu-item 或 el-sub-menu。点击菜单项时,使用 router.push 方法来改变页面的路由,实现导航功能。并通过 useRoute 钩子获取当前激活的路由,然后设置 activeMenu 来决定哪个菜单项应该处于激活状态。这个组件是一个结合 Vue Router 和 Element UI 的动态菜单实现,它可以自动根据路由配置渲染出相应的菜单结构,并且能够响应路由变化,高亮显示当前激活的菜单项。
相关文章:
vue3+element-plus 实现动态菜单和动态路由的渲染
在 Vue.js 中,使用 Vue Router 管理路由数据,并将其用于渲染 el-menu(Element UI 的菜单组件)通常涉及以下几个步骤: 定义路由元数据: 在你的路由配置中,为每个路由项添加 meta 字段,…...
GO-学习-03-基本数据类型
数据类型:基本数据类型和复合数据类型 基本数据类型:整型、浮点型、布尔型、字符串 复合数据类型:数组、切片、结构体、函数、map、通道(channel)、接口 整型: package main import "fmt" im…...
高并发场景下,系统的保护机制
伴随着分布式,微服务项目的快速发展。各个微服务的调用和通讯难免会出现依赖关系,如果上游服务在依赖下游服务的时候下游服务出现了故障从而导致下游服务的不可用,进一步导致了上游的服务被拖垮,就会发生服务雪崩,故障…...
服务器构建私有npm库(Docker + Verdaccio)
npm官网有时候因为网络原因包推不上去,那就简单构建个私有库 私有库不会被共享,且配置不需要太高1h2G就行 1.需要安装Docker,这个跳过了 2.生成配置文件 mkdir /home/verdaccio cd /home/verdaccio mkdir conf && mkdir storage &am…...
LabVIEW做二次开发时应该注意哪些方面?
在使用LabVIEW进行二次开发时,以下几个方面需要特别注意: 需求明确化: 确认并详细记录客户的需求,明确系统的功能、性能、可靠性等要求。制定详细的需求文档,并与客户反复确认,避免后期的需求变更和误解。 …...
docker配置上网代理获取镜像
一、添docker子配置档设置 1、创建目录 mkdir /etc/systemd/system/docker.service.d 2、创建http-proxy.conf文件,增加以下内容 cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF [Service] Environment“HTTP_PROXYhttp://192.168.0.2:8118…...
SqlSugar删除没有定义主键的实体类对应的数据库表数据
一般而言,使用SqlSugar的DbFirst功能创建数据库表实体类时,如果数据库表有主键,生成的实体类对应属性也会标识为主键,如下图所示。 但有时候生成的实体类没有自动配置主键,这时可以通过以下方式进行删除操作&…...
虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”
查询IP地址,eth33 没有显示IP地址 尝试重启,有报错,并且有提示,按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…...
Redis 7.x 系列【30】集群管理命令
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 集群信息2.1 CLUSTER INFO 3. 节点管理3.1 CLUSTER MYID3.2 CLUSTER NODES3…...
将YOLOv8模型从PyTorch的.pt格式转换为TensorRT的.engine格式
TensorRT是由NVIDIA开发的一款高级软件开发套件(SDK),专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型,从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化,包括层融合(layer …...
Hello SLAM(在Linux中实现第一个C++程序)
首先需要安装vim编辑器,输入命令 sudo apt install vim 在Ubuntu上安装好vim编辑器后,创建路径(/home/slambook/ch2),在该路径下创建一个cpp文档(touch hello.c),通过vim编辑器进行…...
IPD推行成功的核心要素(十五)项目管理提升IPD相关项目交付效率和用户体验
研发项目往往包含很多复杂的流程和具体的细节。因此,一套完整且标准的研发项目管理制度和流程对项目的推进至关重要。研发项目管理是成功推动创新和技术发展的关键因素。然而在实际管理中,研发项目管理常常面临着需求不确定、技术风险、人员素质、成本和…...
C++ 鼠标轨迹API【神诺科技SDK】
一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,使得神诺科技 能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。 二.…...
设计模式|观察者模式
观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中,…...
python自动化运维 通过paramiko库和time库实现服务器自动化管理
目录 一.前言 二. 代码实现以及解析 2.1导入必要的库 2.2定义服务器信息 2.3创建 SSH 客户端连接函数 2.4执行远程命令函数 2.5获取系统信息函数 2.6重启服务函数 2.7 主函数 三.致谢 一.前言 在数字化时代,IT 基础设施的规模和复杂性不断增长&am…...
HTML常用的转义字符——怎么在网页中写“<div></div>”?
一、问题描述 如果需要在网页中写“<div></div>”怎么办呢? 使用转义字符 如果直接写“<div></div>”,编译器会把它翻译为块,类似的,其他的标签也是如此,所以如果要在网页中写类似于“<div…...
shell-awk文本处理工具
1、awk概述 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …...
如何在测试中保护用户隐私!
在当今数据驱动的时代,用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中,处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私,并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…...
ARCGIS PRO DSK GraphicsLayer创建文本要素
一、判断GraphicsLayer层【地块注记】是否存在,如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…...
看板项目之vue代码分析
目录: Q1、vue项目怎么实现的输入localhost:8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost:8080就能自动跳到index页面 …...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
