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

vue3+element-plus 实现动态菜单和动态路由的渲染

在 Vue.js 中,使用 Vue Router 管理路由数据,并将其用于渲染 el-menu(Element UI 的菜单组件)通常涉及以下几个步骤:

  1. 定义路由元数据
    在你的路由配置中,为每个路由项添加 meta 字段,这个字段可以包含任何你想要传递给菜单的数据,例如菜单名称、图标等。

  2. 获取路由数据
    使用 router 实例的 getRoutes() 方法来获取当前注册的所有路由信息。

  3. 过滤和格式化数据
    根据需要过滤和格式化路由数据,以便它们可以被 el-menu 组件使用。

  4. 将数据传递给组件
    将格式化好的路由数据传递给使用 el-menu 的组件。

  5. 使用 v-for 渲染菜单
    在组件的模板中,使用 v-for 指令来遍历路由数据,并渲染 el-menu

实现效果

在这里插入图片描述

路由配置

首先是路由配置,要实现这个路由配置,你需要完成以下几个步骤:

  1. 注册 Vue Router:确保你已经在你的 Vue 应用中安装并注册了 Vue Router。

  2. 定义路由:使用 Vue Router 的 addRoute 方法动态添加路由。

  3. 使用路由:在应用中使用 <router-view> 来渲染对应的组件。

  4. 渲染菜单:如果你需要根据路由配置动态渲染菜单(例如使用 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-coloractive-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 方法找到根路由 '/' 的子路由,并筛选出包含 metameta.title 的路由,存储到 list.value

计算属性

  • hasChilden:计算属性,筛选出 list.value 中具有子菜单的路由。
  • noChilden:计算属性,筛选出 list.value 中没有子菜单的路由。

导航处理函数

  • handlemenu:处理无子菜单项的点击事件,使用 router.push 方法导航到点击的菜单项路径。
  • handlemenuchild:处理有子菜单项的点击事件,拼接父菜单和子菜单的路径,然后导航。

激活状态

  • activeMenu:计算属性,根据当前路由的路径 route.path 设置激活的菜单项。

样式部分 (<style>)

  • 定义了一些基本的样式来美化菜单,例如移除边框、设置字体大小和加粗。

总结

这个组件通过 Vue Router 的 useRouter 钩子获取当前路由的配置信息,并根据这些信息动态生成菜单项。使用 computed 属性来区分哪些路由有子菜单,哪些没有,然后相应地渲染 el-menu-itemel-sub-menu。点击菜单项时,使用 router.push 方法来改变页面的路由,实现导航功能。并通过 useRoute 钩子获取当前激活的路由,然后设置 activeMenu 来决定哪个菜单项应该处于激活状态。这个组件是一个结合 Vue Router 和 Element UI 的动态菜单实现,它可以自动根据路由配置渲染出相应的菜单结构,并且能够响应路由变化,高亮显示当前激活的菜单项。

相关文章:

vue3+element-plus 实现动态菜单和动态路由的渲染

在 Vue.js 中&#xff0c;使用 Vue Router 管理路由数据&#xff0c;并将其用于渲染 el-menu&#xff08;Element UI 的菜单组件&#xff09;通常涉及以下几个步骤&#xff1a; 定义路由元数据&#xff1a; 在你的路由配置中&#xff0c;为每个路由项添加 meta 字段&#xff0c…...

GO-学习-03-基本数据类型

数据类型&#xff1a;基本数据类型和复合数据类型 基本数据类型&#xff1a;整型、浮点型、布尔型、字符串 复合数据类型&#xff1a;数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;、接口 整型&#xff1a; package main import "fmt" im…...

高并发场景下,系统的保护机制

伴随着分布式&#xff0c;微服务项目的快速发展。各个微服务的调用和通讯难免会出现依赖关系&#xff0c;如果上游服务在依赖下游服务的时候下游服务出现了故障从而导致下游服务的不可用&#xff0c;进一步导致了上游的服务被拖垮&#xff0c;就会发生服务雪崩&#xff0c;故障…...

服务器构建私有npm库(Docker + Verdaccio)

npm官网有时候因为网络原因包推不上去&#xff0c;那就简单构建个私有库 私有库不会被共享&#xff0c;且配置不需要太高1h2G就行 1.需要安装Docker&#xff0c;这个跳过了 2.生成配置文件 mkdir /home/verdaccio cd /home/verdaccio mkdir conf && mkdir storage &am…...

LabVIEW做二次开发时应该注意哪些方面?

在使用LabVIEW进行二次开发时&#xff0c;以下几个方面需要特别注意&#xff1a; 需求明确化&#xff1a; 确认并详细记录客户的需求&#xff0c;明确系统的功能、性能、可靠性等要求。制定详细的需求文档&#xff0c;并与客户反复确认&#xff0c;避免后期的需求变更和误解。 …...

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删除没有定义主键的实体类对应的数据库表数据

一般而言&#xff0c;使用SqlSugar的DbFirst功能创建数据库表实体类时&#xff0c;如果数据库表有主键&#xff0c;生成的实体类对应属性也会标识为主键&#xff0c;如下图所示。   但有时候生成的实体类没有自动配置主键&#xff0c;这时可以通过以下方式进行删除操作&…...

虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”

查询IP地址&#xff0c;eth33 没有显示IP地址 尝试重启&#xff0c;有报错&#xff0c;并且有提示&#xff0c;按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…...

Redis 7.x 系列【30】集群管理命令

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;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)&#xff0c;专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型&#xff0c;从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化&#xff0c;包括层融合(layer …...

Hello SLAM(在Linux中实现第一个C++程序)

首先需要安装vim编辑器&#xff0c;输入命令 sudo apt install vim 在Ubuntu上安装好vim编辑器后&#xff0c;创建路径&#xff08;/home/slambook/ch2&#xff09;&#xff0c;在该路径下创建一个cpp文档&#xff08;touch hello.c&#xff09;&#xff0c;通过vim编辑器进行…...

IPD推行成功的核心要素(十五)项目管理提升IPD相关项目交付效率和用户体验

研发项目往往包含很多复杂的流程和具体的细节。因此&#xff0c;一套完整且标准的研发项目管理制度和流程对项目的推进至关重要。研发项目管理是成功推动创新和技术发展的关键因素。然而在实际管理中&#xff0c;研发项目管理常常面临着需求不确定、技术风险、人员素质、成本和…...

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;使得神诺科技 能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.…...

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…...

python自动化运维 通过paramiko库和time库实现服务器自动化管理

目录 一.前言 二. 代码实现以及解析 2.1导入必要的库 2.2定义服务器信息 2.3创建 SSH 客户端连接函数 2.4执行远程命令函数 2.5获取系统信息函数 2.6重启服务函数 2.7 主函数 三.致谢 一.前言 在数字化时代&#xff0c;IT 基础设施的规模和复杂性不断增长&am…...

HTML常用的转义字符——怎么在网页中写“<div></div>”?

一、问题描述 如果需要在网页中写“<div></div>”怎么办呢&#xff1f; 使用转义字符 如果直接写“<div></div>”&#xff0c;编译器会把它翻译为块&#xff0c;类似的&#xff0c;其他的标签也是如此&#xff0c;所以如果要在网页中写类似于“<div…...

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …...

如何在测试中保护用户隐私!

在当今数据驱动的时代&#xff0c;用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中&#xff0c;处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私&#xff0c;并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…...

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…...

看板项目之vue代码分析

目录&#xff1a; Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面 …...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...