大致实现以上效果
一、左侧自动加载菜单


NavMenu.vue 菜单组件,简单调整了一下菜单直接的距离,代码如下:

<template>
<div>
<template v-for="item in menus">
<!-- 3、有子菜单,设置不同的 key 和 index -->
<el-submenu v-if="item.hasOwnProperty('children') && item.children.length > 0" :key="'submenu' + item.id"
:index="item.id">
<!-- 4、更多菜单,设置不同样式 -->
<template v-if="item.id === 'menu_more'" slot="title">
<i class="el-icon-more"></i>
</template>

                <!-- 5、title 上添加 @click -->
<template v-else slot="title">
<!-- <i class="el-icon-menu"></i> @click="handleClick(item)"-->
<i v-if="item.hasOwnProperty('icon') && item.icon!== ''" :class="item.icon"></i> 
<span  style="display: inline-block">
{{ item.text }}
</span>
</template>

                <!-- 6、此处添加 el-menu-item 是为了 submenu 能够选中 -->
<el-menu-item v-show="false" :index="item.id" :key="item.id">
<span>{{ item.text }}</span>
</el-menu-item>

                <!-- 7、如果有子级数据使用递归组件 v-on="$listeners"-->
<NavMenu :menus="item.children"></NavMenu>
</el-submenu>

            <!-- 5、没有子菜单,添加 @click @click="handleClick(item)"-->
<el-menu-item v-else :index="item.id" :key="item.id" style="height: 40px;line-height: 40px;">
<!-- <i :class="item.icon"></i> -->
<span>{{ item.text }}</span>
</el-menu-item>
</template>

    </div>
</template>
<script>
export default {
name: "NavMenu",
props: {
menus: {
type: Array,
default: () => []
}
},
data() {
return {
iconList: {
"el-icon-s-tools": "el-icon-s-tools",
"el-icon-s-promotion": "el-icon-s-promotion",
"el-icon-s-platform": "el-icon-s-platform",
"el-icon-s-operation": "el-icon-s-operation",
}
}
},
created() {
console.log("NavMenu created");
console.log(this.menus);
},
methods: {
handleClick(item) {
console.log("NavMenu handleClick", item);
}
}
}


</script>
<style>
.el-menu-item-group__title {
/* 隐藏导航分组 */
display: none;
}

div .el-submenu__title {
/* 导航有子集节点 */
height: 45px;
line-height: 45px;
}

</style>
二、点击菜单,加载相应的选项卡

 //根据点击的菜单,加载相应的选项卡
getNavMenu(navMenus, keyPath, index) {
if (!navMenus || index >= keyPath.length) {
return null;
}
for (var i = 0; i < navMenus.length; i++) {
if (navMenus[i].id === keyPath[index]) {
if (index === keyPath.length - 1) {
return navMenus[i];
} else {
return this.getNavMenu(navMenus[i].children, keyPath, index + 1);
}
}
}
return null;
},
handleSelect(key, keyPath) {
// 选中菜单
// this.openedsindex=keyPath[0];
var temps = [];
for (var i = 0; i < keyPath.length - 1; i++) {
temps.push(keyPath[i]);
}
this.openedsindex = temps;
// console.log("handleSelect", key, keyPath);
// console.log("temps", temps);
var elmenu = this.getNavMenu(this.navMenus, keyPath, 0);
// console.log("addTab", elmenu);
if (elmenu) {

        this.addTab(elmenu);
}
},
// elmenuitemClick(e) {
//   console.log(e.$el.dataset.name);
// },
addTab(param) {
var tabs = this.tabs;
if (tabs.length >= 10) {
this.$notify({
title: '消息提醒',
message: '已经打开了10个选项卡,请关闭一个选项卡后再打开新的选项卡。',
position: 'top-left',
type: 'warning',
duration: 3000,
});
return;
}
var tab = tabs.find(item => item.id === param.id);
// this.editableTabsValue=param.id;
if (tab) {
this.activeTab = param.id;
return;
}
else {
this.tabs.push(param);
this.activeTab = param.id;
}

    },
removeTab(targetName) {
try {
// console.log(targetName);
let tabs = this.tabs;
if (tabs.length <= 1) {
return;
}
let activeName = this.activeTab;
// var text = "";
if (activeName === targetName) {
tabs.forEach((tab, index) => {
if (tab.id === targetName) {
let nextTab = tabs[index + 1] || tabs[index - 1];
if (nextTab) {
activeName = nextTab.id;
// text = nextTab.text;
}
}
});
}
// console.log("removeTab", activeName, text);

        this.tabs = tabs.filter(tab => tab.id !== targetName);
this.activeTab = activeName;
} catch (e) {

        // console.log(e);
}

    }

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

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

相关文章

Shell编程知识整理

文章目录一、Shell介绍1.1 简介1.2 Shell解释器二、快速入门2.1 编写Shell脚本2.2 执行Shell脚本2.3 小结三、Shell程序&#xff1a;变量3.1 语法格式3.2 变量使用3.3 变量类型四、字符串4.1 单引号4.2 双引号4.3 获取字符串长度4.4 提取子字符串4.5 查找子字符串五、Shell程序…

AI与低代码的激情碰撞:微软Power Platform融合GPT-4实战之旅

引言 在当今数字化飞速发展的时代,AI 与低代码技术正成为推动企业变革的核心力量。AI 凭借其强大的数据分析、预测和决策能力,为企业提供了智能化的解决方案;而低代码开发平台则以其可视化、快速迭代的特性,大大降低了应用开发的门槛和成本。这两者的结合,开启了一场全新的…

豆包1.6+PromptPilot实战:构建智能品牌评价情感分类系统的技术探索

豆包1.6PromptPilot实战&#xff1a;构建智能品牌评价情感分类系统的技术探索 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;…

如何在VsCode中使用git(免敲命令版本!保姆级!建议收藏!)

目录 文章目录 前言 一、电脑安装git 二、在vscode安装git插件 三、克隆仓库 四、提交代码 五、创建分支、切换分支、合并分支 1、创建分支 2、切换分支 3、合并分支 六、创建标签和推送标签 七、解决冲突 八、拉取、抓取仓库 九、Reivew代码 总结 前言 随着Vscode的推出和普及…

3.kafka常用命令

在 0.9.0.0 之后的 Kafka&#xff0c;出现了几个新变动&#xff0c;一个是在 Server 端增加了 GroupCoordinator 这个角色&#xff0c;另一个较大的变动是将 topic 的 offset 信息由之前存储在 zookeeper 上改为存储到一个特殊的 topic&#xff08;__consumer_offsets&#xff…

主从DNS和Web服务器搭建过程

完整服务器搭建流程 环境说明 主服务器&#xff1a;192.168.102.128 - DNS Web 从服务器&#xff1a;192.168.102.133 - 从DNS 网站&#xff1a;www.zhangsan.com (HTTPS加密)、www.lisi.com (HTTP) 手动配置主服务器和从服务器的ip地址&#xff0c;dns&#xff0c;网关…

信号无忧,转决千里:耐达讯自动化PROFIBUS集线器与编码器连接术

在工业自动化领域&#xff0c;尤其是高端装备制造、智能产线、精密运动控制等场景中&#xff0c;系统稳定性与信号实时性一直是工程师关注的核心。随着设备智能化程度不断提高&#xff0c;编码器作为运动控制的关键反馈元件&#xff0c;其数量与分布密度显著增加&#xff0c;对…

大模型微调示例四之Llama-Factory-DPO

大模型微调示例四之Llama-Factory-DPO一、强化学习数据处理二、配置训练文档三、模型预测一、强化学习数据处理 原始数据地址&#xff1a;https://nijianmo.github.io/amazon/index.html 第一步&#xff1a;读取 video game 信息 import codecs, json, re from random impor…

Java 将HTML文件、HTML字符串转换为图片

在 Java 开发中&#xff0c;我们经常会遇到将 HTML 内容转换为图片的需求&#xff0c;比如生成网页报告截图、电商商品详情页预览图、在线文档缩略图等。本文将介绍如何使用 Free Spire.Doc for Java 库来实现这一功能。 Free Spire.Doc for Java 是一款免费库且无需任何依赖&a…

(Arxiv-2024)VideoMaker:零样本定制化视频生成,依托于视频扩散模型的内在力量

VideoMaker&#xff1a;零样本定制化视频生成&#xff0c;依托于视频扩散模型的内在力量 paper title&#xff1a;VideoMaker: Zero-shot Customized Video Generation with the Inherent Force of Video Diffusion Models paper是ZJU发布在Arxiv 2024的工作 Code:链接 图1. 我…

录屏、助眠、翻译

01【小熊录屏】 02【全球翻译】 03【声萌助眠】 03 软件获取 小熊录屏&#xff08;点击下载&#xff09; 声萌助眠&#xff08;点击下载&#xff09; 全球-译官&#xff08;点击下载&#xff09;

第17章|PowerShell 安全警报——高分学习笔记(运维实战向)

&#x1f6e1;️ 第17章&#xff5c;PowerShell 安全警报——高分学习笔记&#xff08;运维实战向&#xff09;一句话核心&#xff1a;PowerShell 的“安全设计目标”是——不替你越权&#xff1b;尽量防“误触发不可信脚本”&#xff1b;并非反恶意软件的最后防线。1&#xff…

哈希表性能对比:uthash、hsearch与Linux内核哈希表的深度解析

引言 在网络编程和高性能服务器开发中,高效的数据结构是保证系统性能的关键。本文基于对三种主流哈希表实现(uthash、hsearch和Linux内核哈希表)的深度测试,探讨它们在处理50,000个客户端连接时的性能表现、内存效率及适用场景。 测试环境与方法 测试数据结构 我们使用…

探索 XGBoost 与 LightGBM 的差异:哪个更适合你的项目?

轻松对比&#xff1a;XGBoost 和 LightGBM 的差异与选择指南 在机器学习领域&#xff0c;梯度提升树&#xff08;GBDT&#xff09;是一种广泛使用的算法&#xff0c;而 XGBoost 和 LightGBM 是两款最受欢迎的 GBDT 实现。它们都能够显著提高模型的准确性&#xff0c;但它们之间…

C++链表双杰:list与forward_list

在C容器的世界里&#xff0c;当我们需要频繁地在序列中间进行插入和删除时&#xff0c;基于数组的 vector 会显得力不从心。这时&#xff0c;链表结构就闪亮登场了。STL提供了两种链表容器&#xff1a;功能全面的双向链表 std::list 和极致轻量化的单向链表 std::forward_list。…

Ruoyi-vue-plus-5.x第一篇Sa-Token权限认证体系深度解析:1.4 Sa-Token高级特性实现

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; Sa-Token高级特性实现 前言 在前面的文章中&#xff0c;我们学习了Sa-Token的…

Linux 服务器初始化解析和ssh密钥交换的介绍

目录 2. SSH 基于密钥交换的介绍和原理 2.1 核心优势 2.2 密钥交换原理&#xff08;非对称加密体系&#xff09; 2.3 基础配置步骤 3. 服务器初始化 3.1 安装 yum 网络源 3.1.1 背景说明 3.1.2 实操步骤 3.2 安装运维的必备工具 3.2.1 工具清单 3.2.2 批量安装命令 …

web渗透ASP.NET(Webform)反序列化漏洞

web渗透ASP.NET(Webform)反序列化漏洞1&#xff09;ASP.NET(Webform)反序列化漏洞ASP.NET(Webform) 反序列化漏洞的核心触发点是 Webform 框架中的VIEWSTATE参数 —— 该参数用于存储页面控件状态数据&#xff0c;默认以 Base64 编码传输&#xff0c;内部包含序列化的对象数据。…

Android FrameWork - 开机启动 SystemServer 进程

基于安卓 12 源码分析相关类&#xff1a;frameworks/base/core/java/com/android/internal/os/ZygoteInit.java frameworks/base/core/java/com/android/internal/os/Zygote.java frameworks/base/core/java/com/android/internal/os/RuntimeInit.java frameworks/base/service…

C++:list容器--模拟实现(下篇)

1. 模拟实现 list 一些常用接口// list.h #pragma once #include <assert.h> #include "Iterator.h"namespace room {template<class T>struct list_node{list_node<T>* _next;list_node<T>* _prev;T _data;list_node(const T& x T()):…