16.左侧导航菜单制作

左侧导航菜单制作

1. 修改路由,方便查看页面

index.ts

import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router";
import Layout from '@/layout/Index.vue'const routes: Array<RouteRecordRaw> = [{path: '/',name: 'home',component: Layout}
]const router = createRouter({history: createWebHistory(),routes
})export default router

2. 官网

https://element-plus.org/zh-CN/component/menu.html

3. 在Layout中新建Menu.vue

3.1代码如下

<template><el-radio-group v-model="isCollapse" style="margin-bottom: 20px"><el-radio-button :value="false">expand</el-radio-button><el-radio-button :value="true">collapse</el-radio-button></el-radio-group><el-menudefault-active="2"class="el-menu-vertical-demo":collapse="isCollapse"@open="handleOpen"@close="handleClose"><el-sub-menu index="1"><template #title><el-icon><location /></el-icon><span>Navigator One</span></template><el-menu-item-group><template #title><span>Group One</span></template><el-menu-item index="1-1">item one</el-menu-item><el-menu-item index="1-2">item two</el-menu-item></el-menu-item-group><el-menu-item-group title="Group Two"><el-menu-item index="1-3">item three</el-menu-item></el-menu-item-group><el-sub-menu index="1-4"><template #title><span>item four</span></template><el-menu-item index="1-4-1">item one</el-menu-item></el-sub-menu></el-sub-menu><el-menu-item index="2"><el-icon><icon-menu /></el-icon><template #title>Navigator Two</template></el-menu-item><el-menu-item index="3" disabled><el-icon><document /></el-icon><template #title>Navigator Three</template></el-menu-item><el-menu-item index="4"><el-icon><setting /></el-icon><template #title>Navigator Four</template></el-menu-item></el-menu>
</template><script lang="ts" setup>
import { ref } from 'vue'
import {Document,Menu as IconMenu,Location,Setting,
} from '@element-plus/icons-vue'const isCollapse = ref(true)
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-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;min-height: 400px;
}
</style>

3.2 效果图

在这里插入图片描述

3.3 修改样式

<template><el-menudefault-active="2"class="el-menu-vertical-demo":collapse="isCollapse"@open="handleOpen"@close="handleClose"background-color="#0a2542"><!-- 隐藏展开按钮 --><el-radio-group v-model="isCollapse" style="margin-bottom: 20px;margin-left: 9px;"><el-radio-button :value="false" v-show="isCollapse" >|||</el-radio-button><el-radio-button :value="true" v-show="!isCollapse">|||</el-radio-button></el-radio-group><el-sub-menu index="1"><template #title><el-icon><location /></el-icon><span>Navigator One</span></template><el-menu-item-group><template #title><span>Group One</span></template><el-menu-item index="1-1">item one</el-menu-item><el-menu-item index="1-2">item two</el-menu-item></el-menu-item-group><el-menu-item-group title="Group Two"><el-menu-item index="1-3">item three</el-menu-item></el-menu-item-group><el-sub-menu index="1-4"><template #title><span>item four</span></template><el-menu-item index="1-4-1">item one</el-menu-item></el-sub-menu></el-sub-menu><el-menu-item index="2"><el-icon><icon-menu /></el-icon><template #title>Navigator Two</template></el-menu-item><el-menu-item index="3" disabled><el-icon><document /></el-icon><template #title>Navigator Three</template></el-menu-item><el-menu-item index="4"><el-icon><setting /></el-icon><template #title>Navigator Four</template></el-menu-item></el-menu>
</template><script lang="ts" setup>
import { ref } from 'vue'
import {Document,Menu as IconMenu,Location,Setting,
} from '@element-plus/icons-vue'//只允许展开一个子菜单
// const uniqueOpened = ref(true)
const isCollapse = ref(true)
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-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;min-height: 400px;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {width: 230px;min-height: 400px;
}
.el-menu {border-right: none;
}//主菜单颜色
:deep(.el-sub-menu .el-sub-menu__title){color: #f5f4f4 !important;
}/*子菜单文字颜色*/
:deep(.el-menu .el-menu-item){color: #e1e5ea;
}
/* 菜单点中文字的颜色 */:deep(.el-menu-item.is-active){color: #f07810 !important;
}
/* 当前打开菜单的所有子菜单颜色 */:deep(.is-opened .el-menu-item){background-color: #082343 !important;
}
/* 鼠标移动菜单的颜色 */:deep(.el-menu-item:hover){background-color: #001528 !important;
}</style>

3.4 效果图

在这里插入图片描述

在这里插入图片描述

4. 在Layout中新建MenuItem.vue

4.1 代码如下

<template><template v-for="menu in menuList" :key="menu.path"><!-- 判断是否有子菜单 --><el-sub-menu v-if="menu.children && menu.children.length > 0" :index="menu.path"><template #title><el-icon><!-- 动态组件 图标传入 --><component :is="menu.meta.icon"></component></el-icon><span>{{ menu.meta.title }}</span></template><!-- 递归渲染子菜单 --><menu-item :menuList="menu.children"></menu-item></el-sub-menu><el-menu-item v-else :index="menu.path"><el-icon><component :is="menu.meta.icon"></component></el-icon><template #title>{{ menu.meta.title }}</template></el-menu-item></template>
</template><script setup lang="ts">
// 接收父组件传递的menuList数据
defineProps(['menuList'])
</script><style scoped lang="less"></style>

知识点补充

component是vue内置组件,主要作用为动态渲染组件,基本用法如下:

官网:动态组件 & 异步组件 | Vue.js (vueframework.com)

<!-- 动态组件由 vm 实例的 `componentName` property 控制 -->
<component :is="componentName"></component>

4.2 Menu.vue修改

<template><!-- router是否启用 vue-router 模式。 启用该模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 --><el-menudefault-active="/dashboard"class="el-menu-vertical-demo":collapse="isCollapse"routerunique-opened@open="handleOpen"@close="handleClose"background-color="#0a2542"><!-- 隐藏展开按钮 --><el-radio-group v-model="isCollapse" style="margin-bottom: 20px;margin-left: 9px;"><el-radio-button :value="false" v-show="isCollapse" >|||</el-radio-button><el-radio-button :value="true" v-show="!isCollapse">|||</el-radio-button></el-radio-group><!-- 父组件传递数据 --><MenuItem :menuList="menuList"></MenuItem></el-menu>
</template><script lang="ts" setup>
import { ref,reactive } from 'vue'
import MenuItem from './MenuItem.vue';//菜单数据
let menuList = reactive([{path: "/dashboard",component: "Layout",name: "dashboard",meta: {title: "首页",icon: "HomeFilled",roles: ["sys:dashboard"],},},{path: "/system",component: "Layout",name: "system",meta: {title: "系统管理",icon: "Setting",roles: ["sys:manage"],},children: [{path: "/adminUser",component: "/system/AdminUser",name: "adminUser",meta: {title: "管理员管理",icon: "UserFilled",roles: ["sys:adminUser"],},},{path: "/userList",component: "/system/UserList",name: "userList",meta: {title: "用户管理",icon: "Wallet",roles: ["sys:userList"],},},{path: "/menuList",component: "/system/MenuList",name: "menuList",meta: {title: "菜单管理",icon: "Menu",roles: ["sys:menu"],},},],},{path: "/goodsRoot",component: "Layout",name: "goodsRoot",meta: {title: "商品管理",icon: "Histogram",roles: ["sys:goodsRoot"],},children: [{path: "/goodsType",component: "/goods/GoodsType",name: "goodsType",meta: {title: "商品分类",icon: "UserFilled",roles: ["sys:goodsType"],},},{path: "/unusedList",component: "/goods/UnusedList",name: "unusedList",meta: {title: "闲置商品",icon: "Wallet",roles: ["sys:unusedList"],},},{path: "/buyList",component: "/goods/BuyList",name: "buyList",meta: {title: "求购商品",icon: "Wallet",roles: ["sys:buyList"],},},],},{path: "/order",component: "Layout",name: "order",meta: {title: "订单管理",icon: "Tickets",roles: ["sys:order"],},children: [{path: "/unusedOrder",component: "/order/UnusedOrder",name: "unusedOrder",meta: {title: "闲置订单",icon: "UserFilled",roles: ["sys:unusedOrder"],},},{path: "/buyOrder",component: "/order/BuyOrder",name: "buyOrder",meta: {title: "求购订单",icon: "Wallet",roles: ["sys:buyOrder"],},},],},{path: "/comment",component: "Layout",name: "comment",meta: {title: "评论管理",icon: "Briefcase",roles: ["sys:comment"],},children: [{path: "/commentList",component: "/comment/CommentList",name: "commentList",meta: {title: "评论列表",icon: "UserFilled",roles: ["sys:commentList"],},},],},
]);//只允许展开一个子菜单
// const uniqueOpened = ref(true)
const isCollapse = ref(true)
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-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;min-height: 400px;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {width: 230px;min-height: 400px;
}
.el-menu {border-right: none;
}//主菜单颜色
:deep(.el-sub-menu .el-sub-menu__title){color: #f5f4f4 !important;
}/*子菜单文字颜色*/
:deep(.el-menu .el-menu-item){color: #e1e5ea;
}
/* 菜单点中文字的颜色 */:deep(.el-menu-item.is-active){color: #f07810 !important;
}
/* 当前打开菜单的所有子菜单颜色 */:deep(.is-opened .el-menu-item){background-color: #082343 !important;
}
/* 鼠标移动菜单的颜色 */:deep(.el-menu-item:hover){background-color: #001528 !important;
}</style>

4.3 在index.vue中引入

<template><el-container class="mycontainer"><el-aside width="230px" class="asside"><Menu></Menu></el-aside><el-container><el-header class="header">Header</el-header><el-main class="mymain">Main</el-main></el-container></el-container>
</template><script setup lang="ts">
import Menu from "./Menu.vue"
</script><style scoped lang="scss">
.mycontainer{height: 100%;.asside{background-color: #0a2542;// 使宽度自适应width: auto;}.header{background-color: rgb(164, 194, 255);}.mymain{background-color: rgb(242, 187, 136);}
}
</style>

5. 最终效果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【SpringCloud学习笔记】Elasticsearch

1. Elasticsearch 1.1 安装ES 启动Docker&#xff1a;service docker restart / systemctl restart docker基于Docker创建网络docker network create hm-net向云服务器上传elasticsearch以及kibana的tar包&#xff0c;并使用docker load -i xxx.tar进行加载使用如下命令启动e…

APD系列特高频局放监测装置

安科瑞电气股份有限公司 祁洁 15000363176 一、产品概述 现阶段&#xff0c;电力系统对于电能的质量提出越来越高的要求&#xff0c;不仅要确保供电稳定可靠&#xff0c;而且供电的安全性也是重要要求。电力系统中&#xff0c;金属封闭开关设备得到广泛应用&#xff0c;因…

程序猿大战Python——流程控制——其他控制语句

for循环 目标&#xff1a;掌握for循环的使用。 与while循环功能类似&#xff0c;for语句也能完成反复多次的执行。 for语法&#xff1a; for 临时变量 in 序列:满足条件时&#xff0c;执行的代码1满足条件时&#xff0c;执行的代码2…… [else:当for循环正常执行结束后&#…

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况&#xff0c;程序在执行过程中&#xff0c;数据导致程序不正常&#xff0c;最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分&#xff0c;比如我们比较熟悉的数组越…

TikTok Shop账号需要防关联吗?

在TikTokShop作为新兴的电商销售渠道中&#xff0c;保护账号的安全和隐私&#xff0c;防止账号关联成为了重要的任务。为了更好地理解为何需要防关联以及如何进行防范&#xff0c;让我们深入探讨一下这个问题。 为什么要防关联&#xff1f; 1. 账号异常风险&#xff1a;防关联…

苹果AI来了,ios18史诗级发布

今天凌晨1点&#xff0c;苹果举行了WWDC开发者大会&#xff0c;正式发布了 全新iOS 18、iPadOS 18、watchOS 11、tvOS 18、macOS 等以及Apple Intelligence的个人化智能系统 苏音给大家汇总下&#xff0c;ios18的更新内容以及苹果的AI。 本次更新&#xff0c;官方带来的title…

HBuilder X运行项目到微信开发者工具调试和发布Uniapp小程序

1.下载和安装 HBuilderX hbuilder首页&#xff1a;https://www.dcloud.io/hbuilderx.html 下载hbuilder编辑器,选择对应的系统,Windows和mac正式版即可,下载后免安装直接点击即可使用。 打开HBuilder之后&#xff0c;它会要求你注册一个用户&#xff0c;然后才可以使用。 …

如何预览XtraGrid控件

如何预览XtraGrid。 private void ShowGridPreview(DevExpress.XtraGrid.GridControl grid) {// Check whether the Grid Control can be previewed.if(!grid.IsPrintingAvailable) {MessageBox.Show("The DevExpress.XtraPrinting Library is not found", "Er…

使用 Scapy 库编写 TCP 窗口大小探测攻击脚本

一、介绍 1.1 概述 TCP窗口大小探测攻击是一种信息收集攻击&#xff0c;攻击者通过向目标服务器发送特制的TCP数据包&#xff0c;探测目标服务器的TCP接收窗口大小&#xff08;TCP Window Size&#xff09;。了解目标服务器的TCP接收窗口大小&#xff0c;可以帮助攻击者优化后…

【漏洞复现】CraftCMS ConditionsController.php 代码执行漏洞(CVE-2023-41892)

0x01 产品简介 Crat CMS是一个开源的内容管理系统&#xff0c;它专注于用户友好的内容创建过程&#xff0c;逻辑清晰明了&#xff0c;是一个高度自由&#xff0c;高度自定义设计的平台&#xff0c;可以用来创建个人或企业网站也可以搭建企业级电子商务系统。 0x02 漏洞概述 …

万兴优转 v15 解锁版安装教程(全能音视频格式转换器)

前言 Wondershare UniConverter&#xff08;万兴优转&#xff09;国产全能音视频格式转换器。万兴格式转换器具有音视频格式转换、合并视频、视频压缩、视频编辑、视频录制、下载视频、元数据修复、VR视频转换、字幕编辑器、GIF制作、DVD刻录等一站式视频工具箱功能。万兴转换…

数新网络签单国泰君安:利用数据服务平台提升金融业务用数能力

近日&#xff0c;数新网络与国泰君安证券股份有限公司&#xff08;以下简称“国泰君安”&#xff09;达成了数据服务平台升级项目的签约。这一项目的推进将更好地服务于国泰君安内部业务部门的数据需求&#xff0c;帮助数据平台更加有效地实现提升业务响应效率的目标&#xff0…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:AI智能监控 用于沙滩救援

以色列的一个团队在人工智能领域取得的成果引起了轰动。 今天他们取得的成果源于多年前的一个想法。Netanel Eliav 和 Adam Bismut 是校园时代的旧伙伴&#xff0c;当时他们想要解决一个可以改变世界的问题&#xff0c;由此引出这样一个想法&#xff1a;溺水的 Bismut 漂流到死…

【数据分析基础】实验二 Python程序流程控制、函数设计与使用

实验目的 熟悉选择结构嵌套时代码的缩进与对齐。理解带 else 子句的循环结构执行流程和条件表达式 value1 if condition else value2 的用法。熟悉使用循环和异常处理机构对用户输入进行约束的用法。掌握Python程序中进行选择、循环流程控制的语句、语法&#xff0c;熟练运用选…

SpringAI--使用免费API-Key和API进行配置

目录 &#x1f4da; 前言 &#x1f4d1;Spring AI简介 &#x1f4ac; 项目配置 &#x1f4da; 系统功能的具体实现 &#x1f4ac; 编写Controller控件 &#x1f4da; 前言 &#x1f4d1;博客主页&#xff1a;丘比特惩罚陆 &#x1f496;欢迎关注&#xff1a;点赞收藏⭐留言✒…

【Vue】getters

除了state之外&#xff0c;有时我们还需要从state中筛选出符合条件的一些数据&#xff0c;这些数据是依赖state的&#xff0c;此时会用到getters getters就类似于属性中的计算属性 这个getter只有获取&#xff0c;如果需要设置修改&#xff0c;还是需要经过mutations getters里…

C++网络编程基础

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议&#xff1a;收到数据后&#xff0c;多出来的那一部分&#xff0c;也叫一种 “约定”&#xff0c;一整套的自硬件到软件&#xff0c;都有协议&#xff0c;需要有人定制&a…

如何使用Python在word文档中创建表格

如何使用Python在word文档中创建表格 介绍效果代码 介绍 本文将介绍如何使用Python库python-docx在Word文档中创建表格。 效果 插入表格前的word文档&#xff1a; 插入表格后的word文档&#xff1a; 代码 from docx import Document# 加载现有的Word文档 doc Document(…

【护网简历模版】改了10个在校大学生的简历的感想

护网简历模版 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 在上篇文章中&#xff1a;如何面试…

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节&#xff0c;我们说一下 js-tool-big-box 添加的最新工具方法&#xff0c;在日常前端开发工作中&#xff0c;如果网页很长&#xff0c;我们就需要获取当前浏览器是在向上滚动&#xff0c;还是向下滚动。如果向上滚动&#xff0c;滚动到0的时候呢&#xff0c;需要做一些…