vue3通过el-cascader实现动态菜单切换页面

如果只有一级菜单只会显示一个按钮
在这里插入图片描述

 <div style="width: 100%; margin-top: 10px; display: flex; align-items: center; border-bottom: 1px solid #ccc;"><template v-for="(menu, index) in cascaderData" :key="index"><el-cascaderv-if="menu.children && menu.children.length > 0"style="width: 120px;"v-model="selectedOptions[index]":options="menu.children"@change="handleCascaderChange(index, $event)":placeholder="menu.label"></el-cascader><el-button :style="{color: buttonColor}" plain @click="handleSelect(String(index))" v-else>{{ menu.label }}</el-button></template></div>

菜单结构说明:component对应的就是你要跳转的页面组件,也就是上面import进来的组件。然后通过emitComponentChange方法来跳转对应页面。

<script setup>
import {useRouter} from 'vue-router';
import signal from '@/views/drawing/station/index';
import permutation from '@/views/drawing/permutationtable/permutation';
import gdgtable from '@/views/drawing/permutationtable/gdgtable';
import request from "../../../utils/request";
import {watch} from "vue";import {useStationsStore} from "@/views/drawing/store/index";const stationsStore = useStationsStore();const router = useRouter();const buttonColor = ref('black')const drawCodeList = ref([]);const xhjMenu = ref([])const cascaderData =ref( [{value: '0',label: '基础数据',children: [],component: signal},{value: '1',label: '封面及目录',children: [{value: '1-1', label: '封面'},{value: '1-2', label: '目录'},]},{value: '2',label: '测试1',children: [{value: '2-1', label: '测试1-1'},{value: '2-2', label: '测试1-2'},]},{value: '4',label: '测试3',children: [{value: '4-1', label: '测试3-1', component: lsbtable},{value: '4-2', label: '测试3-2', component: dclsbtable},]},{value: '6',label: '测试4',children: [{value: '6-1', label: '测试4-1', children: xhjMenu.value},	//这里用到了动态请求后端获取的三级菜单{value: '6-2', label: '测试4-2', component: dctable},{value: '6-3', label: '测试4-3'},{value: '6-4', label: '测试4-4', children: [{value: '6-4-1', label: '测试4-4-1', component: qdcjtable},{value: '6-4-2', label: '测试4-4-2'},]},{value: '6-5', label: '测试4-5'},]},
]);// 用于存储选择的菜单项
const selectedOptions = ref([]);// 处理 el-cascader 改变事件
const handleCascaderChange = (index, value) => {recoverButton(index);let menu = String(value)if (value.length === 2) {			//如果是二级菜单,截取第二位数据menu = String(value[1])}handleSelect(menu)
}//处理菜单跳转事件
const handleSelect = async (menu) => {buttonColor.value = '#a7aab1'let component = findComponentByValue(cascaderData.value, menu);if (menu === '0') {buttonColor.value = 'black';recoverButton(menu);}if (menu === '7-3') {const type = await changeStation();if (type === 4) {emitComponentChange(jkgksktable);} else {emitComponentChange(jkgTktable);}}if (menu.includes('xhjtable')){let tuzhiCode = findTuZhiCodeByValue(cascaderData.value, menu);stationsStore.setTuzhiCode(tuzhiCode);emitComponentChange(component);}if (component != null) {emitComponentChange(component);}
};//这个方法是用来跳转对应页面的
const emitComponentChange = (component) => {// 触发自定义事件,传递组件或其他数据const event = new CustomEvent('componentChange', {detail: component});window.dispatchEvent(event);
};//将其他按钮恢复原状
function recoverButton(index) {console.log(selectedOptions.value)for (const item of cascaderData.value) {selectedOptions.value[item.value] = []; //全部恢复原状// if (parseInt(item.value) !== index) {//   selectedOptions.value[item.value] = [];//将除了当前选中的菜单框都恢复原状// }}console.log(selectedOptions.value)
}// 匹配菜单页面
function findComponentByValue(data, targetValue) {for (let i = 0; i < data.length; i++) {const item = data[i];if (item.value === targetValue) {return item.component;}if (item.children && item.children.length > 0) {const result = findComponentByValue(item.children, targetValue);if (result) {return result;}}}return null;
}// 获取图纸code
function findTuZhiCodeByValue(data, targetValue) {for (let i = 0; i < data.length; i++) {const item = data[i];if (item.value === targetValue) {return item.tuzhiCode;}if (item.children && item.children.length > 0) {const result = findTuZhiCodeByValue(item.children, targetValue);if (result) {return result;}}}return null;
}listDingXingTuList().then((data) => { 	//这里通过请求后端接口动态获取三级菜单并赋值drawCodeList.value = data.data;cascaderData.value[6].children[0].children = drawCodeList.value.map(item => ({value: 'xhjtable'+item.id,		label: item.tuzhiName,component: xhjtable,tuzhiCode: item.tuzhiCode		//格式和一二级菜单保持一致,可以增加字段}));
})</script>

下面是切换页面后要显示的目标页面,这里接收上面emitComponentChange 方法传递过来的组件

<template><el-row><el-col :span="20"><!-- 顶部菜单 --><div v-if="showTop"><topmenu /></div><!-- 右侧下方区域动态切换的内容 --><div style="flex: 1;"><component :is="currentComponent" /></div></el-col></el-row>
</template><script setup>
import {onMounted, shallowRef} from 'vue';
import Topmenu from "./station/topmenu";const currentComponent = shallowRef(signal);//主动监听事件
onMounted(() => {window.addEventListener('componentChange', (event) => {const component = event.detail;// 在这里处理接收到的组件或其他数据currentComponent.value = component;});
});getStationList()
</script>

还有一种方式是通过el-menu实现的,效果同上,使用的js方法都是一样的

<el-menu:default-active="activeIndex"class="el-menu-demo"mode="horizontal"@select="handleSelect"background-color="#f8f8f9"style="margin-top: 20px;margin-left: 1px"><template v-for="(item, index) in cascaderData"><template v-if="!item.children"><el-menu-item :key="item.index" :index="item.value">{{ item.label }}</el-menu-item></template><el-sub-menu v-else :key="item.value" :index="item.value"><template #title>{{ item.label }}</template><template v-for="(child, childIndex) in item.children"><template v-if="!child.children"><el-menu-item :key="child.value" :index="child.value">{{ child.label }}</el-menu-item></template><el-sub-menu v-else :key="child.value + '-sub'" :index="child.value"><template #title>{{ child.label }}</template><el-menu-itemv-for="(subItem, subIndex) in child.children":key="subItem.value":index="subItem.value">{{ subItem.label }}</el-menu-item></el-sub-menu></template></el-sub-menu></template></el-menu>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整数和浮点数在内存中存储

整数在内存中的存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。 对于整形来说&#xff0c;数据存放内存中的其实是补码。 在计算机系统中&#xff0c;数值一律用补码来表示和存储。原因是&#xff0c;使用补码&#xff0c;可以使符号位和数值域统一处理&am…

DUSt3R:简化三维重建

3D 重建是从二维 (2D) 图像创建对象或场景的 3D 虚拟表示的任务&#xff0c;可用于模拟、可视化或本地化等多种目的。 它广泛应用于计算机视觉、机器人和虚拟现实&#xff08;VR&#xff09;等多个领域。 在基本设置中&#xff0c;3D 重建方法输入一对图像 I1 和 I2&#xff0c…

关于Java对接网络验证+实践小例子,简单易懂

一个简单的网络验证小例子&#xff0c;各位大佬勿喷 突发奇想&#xff0c;如果一位A友找你拿一份 Working Fruits&#xff0c;但是你不想这位A友把你辛苦劳作、熬夜加点写出的代码分享他或她的另外一位朋友B友&#xff0c;也许并不是很有价值的一个小作业而已&#xff0c;但是就…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的…

模拟B\S服务器(扩展知识点)

3.2 模拟B\S服务器(扩展知识点) 模拟网站服务器&#xff0c;使用浏览器访问自己编写的服务端程序&#xff0c;查看网页效果。 案例分析 准备页面数据&#xff0c;web文件夹。 复制到我们Module中&#xff0c;比如复制到day08中 我们模拟服务器端&#xff0c;ServerSocket类…

SpringCloud Alibaba实战和源码(8)OpenFeign使用

1、 使用Feign实现远程HTTP调用 1.1、常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 J…

RN开发搬砖经验之—处理“Duplicate class com.github.barteksc.pdfviewer“

问题信息 Duplicate class com.github.barteksc.pdfviewer.PDFView found in modules jetified-AndroidPdfViewer-3.1.0-beta.3-runtime (com.github.TalbotGooday:AndroidPdfViewer:3.1.0-beta.3) and jetified-android-pdf-viewer-2.8.2-runtime (com.github.barteksc:andro…

为车主提供多路况安全保障!“北欧轮胎安全专家”熊牌轮胎迎来全新升级

德国马牌轮胎旗下明星品牌——Gislaved熊牌轮胎迎来全新升级。 自进入中国市场以来&#xff0c;熊牌轮胎凭借着坚韧安全、静音降噪等特点&#xff0c;收获无数好评。此次全新升级的熊牌轮胎&#xff0c;在品牌logo中加入了“北欧棕熊”的形象&#xff0c;并且对此前轮胎标签中的…

qt使用Windows经典风格,以使QTreeView或QTreeWidge有节点线或加号

没有使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 树展开时&#xff1a; 树未展开时&#xff1a; 可以看到&#xff1a; 未使用Windows经典风格时&#xff0c;QTreeView或QTreeWidget…

【MySQL】基本查询(1)

【MySQL】基本查询&#xff08;1&#xff09; 目录 【MySQL】基本查询&#xff08;1&#xff09;表的增删改查Create单行数据 全列插入多行数据 指定列插入插入否则更新替换 RetrieveSELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不…

第六篇:视频广告格式上传指南(上) - IAB视频广告标准《数字视频和有线电视广告格式指南》

第六篇&#xff1a; 视频广告格式和上传指南&#xff08;上&#xff09; --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; 流媒体数字视频的广告格式分为线性和非线性两大类。任何一个广告都可以与显示在视频播放器外部的伴随横幅一起提…

【Linux文件系列】重定向

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CMake学习(下)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

windows系统下python进程管理系统

两年来&#xff0c;我们项目的爬虫代码大部分都是放在公司的windows机器上运行的&#xff0c;原因是服务器太贵&#xff0c;没有那么多资源&#xff0c;而windows主机却有很多用不上。为了合理利用公司资源&#xff0c;降低数据采集成本&#xff0c;我在所以任务机器上使用anac…

将本地的项目上传到gitee,

场景&#xff1a;在本地有一个项目&#xff0c;想要把这个项目上传到gitee&#xff0c;且在gitee中已经创建好仓库 依次执行下图中的命令&#xff1a;

【linux】进程地址空间(进程三)

目录 快速了解&#xff1a;引入最基本的理解&#xff1a;细节&#xff1a;如何理解地址空间&#xff1a;a.什么是划分区域&#xff1a;b.地址空间的理解&#xff1a; 为什么要有进程空间&#xff1f;进一步理解页表与写时拷贝&#xff1a; 快速了解&#xff1a; 先来看这样一段…

2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作…

第四范式2023全年业绩:营收人民币42.0亿元同比增长36.4%,行业大模型为千行万业赋能...

3月20日&#xff0c;第四范式&#xff08;06682.HK&#xff09;公布2023年全年业绩&#xff0c;营收稳步增长&#xff0c;盈利节奏清晰。 第四范式定位人工智能时代的软件企业&#xff0c;致力于用人工智能技术赋能千行万业&#xff0c;帮助各行业发现更多规律&#xff0c;形成…

【排序】插入排序与选择排序详解

文章目录 &#x1f4dd;选择排序是什么&#xff1f;&#x1f320;选择排序思路&#x1f309; 直接选择排序&#x1f320;选择排序优化&#x1f320;优化方法&#x1f309;排序优化后问题 &#x1f320;选择排序效率特性 &#x1f309;插入排序&#x1f320;插入排序实现 &#…

day11【网络编程】-综合案例

day11【网络编程】 第三章 综合案例 3.1 文件上传案例 文件上传分析图解 【客户端】输入流&#xff0c;从硬盘读取文件数据到程序中。【客户端】输出流&#xff0c;写出文件数据到服务端。【服务端】输入流&#xff0c;读取文件数据到服务端程序。【服务端】输出流&#xf…