vue3 -layui项目-左侧导航菜单栏

news2024/11/25 4:27:11

1.创建目录结构

进入cmd,先cd到项目目录(项目vue3-project)

cd vue3-project
mkdir -p src\\views\\home\\components\\menubar

2.创建组件文件

3.编辑menu-item-content.vue

<template>
	<template v-if="item.icon">
		<lay-icon :type="item.icon"></lay-icon>
	</template>
	{{ item.title }}
</template>

<script setup lang="ts">
import { computed } from 'vue';

const props= defineProps({
	// 菜单内容
	content: null,
});

// 获取父级菜单数据
const item = computed(() => {
	return props.content;
});

</script>
<style scoped lang="scss">

</style>

 4.编辑menu-item.vue

<template>
	<template v-if="item.children && item.children.length>0">
		<lay-sub-menu :id="item.path" >
			<template v-slot:title>
				<MenuItemContent :content="item" />
			</template>
			
			<o-menu v-for="data in item.children"  :content="data" />
		</lay-sub-menu>
	</template>
	<template v-else>
		<lay-menu-item :id="item.path" >
			<MenuItemContent :content="item" />
		</lay-menu-item>
	</template>
</template>

<script setup lang="ts">
import { computed } from 'vue';
import MenuItemContent from './menu-item-content.vue';

defineOptions({
		name:"OMenu"
	}
);
const props= defineProps({
	// 菜单内容
	content: null,
});

// 获取父级菜单数据
const item = computed(() => {
	return props.content;
});

</script>
<style scoped lang="scss">


</style>

5. 编辑menubar.vue

<template>
	<lay-menu  
			  v-model:selected-key="selectedKey"
			  v-model:open-keys="openKeys"
			  :tree="true" :indent="true"
			  :collapse="collapse"  @changeSelectedKey="changeSelectedKey">
		<template v-for="menu in menus">
			<MenuItem :content="menu" />
		</template>
	</lay-menu>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { storeToRefs } from 'pinia';
import { useRouter, useRoute } from 'vue-router'
import { useMenuStore } from '@/stores/menu'
import MenuItem from './menu-item.vue';

const menuStore = useMenuStore()
const { menus,collapse } = storeToRefs(menuStore)

const route = useRoute();
const router = useRouter()

const selectedKey = ref(route.path)
const openKeys = ref<string[]>([])

const changePath=()=>{
	let len = route.matched.length;
	if(len>1){
		for(var i=len-2;i>0;i--){
			openKeys.value.push(route.matched[i].path);
		}
	}
}

changePath();

const changeSelectedKey=(val: string)=>{
	router.push(val);
}

</script>
<style scoped lang="scss">

.layui-nav{
	background-color:var(--o-sidebar-bg-color);
}

.layui-nav-tree {
	width: var(--o-sidebar-width);
}

:deep(.layui-nav-item>a *){
	color:var(--o-sidebar-text-color);
}


:deep(.layui-nav-child){
	background-color:var(--o-sidebar-bg-color);
}


:deep(.layui-nav-item>a){
	display:flex;
	
}

</style>

6.添加菜单数据类型定义

types/menu.d.ts

declare interface Meta{
	id: string;
	name: string;
	path: string;
	title: string;
}

declare interface MenuMeta extends Meta{
	icon?: string;
}

declare interface MenuJsonInfo  extends MenuMeta{
	parentId: number;
}

declare interface MenuInfo extends MenuMeta{
	children?: MenuInfo[];
}

// 菜单信息
declare interface MenuInfoState {
  activeName: string;
  menu: MenuInfo;
}

7.添加store

stroes/menu.ts

import {defineStore} from 'pinia';

/**
 * 
 * @methods 设置菜单信息
 */
export const useMenuStore = defineStore('menu',{
	persist: true,//数据持久化设置
  state: (): MenuInfoState => ({
	collapse: false,
	menu: {
		name: '',
		title: '',
		path: '/',
		children: []
	},
  }),
  
  getters:{
	menus(state){
		return state.menu.children;
	}
  },
  actions: {

    async gen(datas: MenuJsonInfo[]) {
	  const that = this;
      const map:Record<number, MenuInfo> = {};
	  datas.forEach((item: MenuJsonInfo) =>{
		map[item.id] = {title:item.title,name:item.name, path:item.path,icon:item.icon, children: [] };
	  });

	  const findParent = (item: MenuJsonInfo)=>{
		  if(item.pid == 0 ){
				that.menu.children?.push(map[item.id]);
		  }else {
			  const parent = map[item.pid];
			  if(parent){
				  parent.children?.push(map[item.id]);
			  }
		  }
	  };
	  
	  datas.forEach((item: MenuJsonInfo) =>{
		  findParent(item);
	  });

    },
	handleCollape(){
		this.collapse = !this.collapse;
		return this.collapse;
	},
	clear(){
		this.menu.children =[];
	},

  },

  

});

展示菜单效果:

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

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

相关文章

计算机网络八股文(后续更新)

文章目录 一、计算机网络体系结构1、计算机网络的各层协议及作用&#xff1f; 二、物理层三、数据链路层四、网络层五、传输层1、TCP和UDP的区别&#xff1f;2、UDP 和 TCP 对应的应用场景是什么&#xff1f;3、详细介绍一下 TCP 的三次握手机制4、为什么需要三次握手&#xff…

Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开

背景 在调研浏览器多开的过程中&#xff0c;electron 有自带的 browserview&#xff0c;webview&#xff0c;但是上面两个受制于 electron 内核版本限制&#xff0c;升级不够灵活&#xff0c;对新版的网页支持可能不及时&#xff0c;甚至不兼容&#xff0c;必须通过发布新的客…

MSP430M03507最小系统板的keil环境搭配,用keil编辑ti单片机

转载自嘉立创MSP430M03507开发手册 这篇文章只是因为我的keil版本与嘉立创的不一样&#xff0c;所以添加了我自己遇到的问题解析 先说说为什么要用keil编辑&#xff0c;因为ti单片机自己的ccs编译环境需要对应仿真器&#xff0c;那个加芯片都240了&#xff0c;哪有那么多钱买…

JAVA开发工具IDEA如何连接操作数据库

一、下载驱动 下载地址&#xff1a;【免费】mysql-connector-j-8.2.0.jar资源-CSDN文库 二、导入驱动 鼠标右击下载到IDEA中的jar包&#xff0c;选择Add as Library选项 如图就导入成功 三、加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 四、驱动管理…

Bootstrap5 Navbar多级下拉框

实现目标&#xff1a; 1、访问 Bootstrap5-navbar 2、修改dropdown为多级 <!DOCTYPE HTML> <html lang"en-US"> <head><meta charset"UTF-8"><title></title><link rel"stylesheet" href"https…

视频汇聚平台EasyCVR启动出现报错“cannot open shared object file”的原因排查与解决

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xf…

python实现图像特征提取算法1

python实现Marr-Hildreth算法、Canny边缘检测器算法 1.Marr-Hildreth算法详解算法步骤公式Python 实现详细解释优缺点 2.Canny边缘检测器算法详解算法步骤公式Python 实现详细解释优缺点 1.Marr-Hildreth算法详解 Marr-Hildreth算法是一个用于图像边缘检测的经典算法&#xff…

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…

四大引用——强软弱虚

目录 一、强引用 二、软引用 三、弱引用 四、虚引用 一、强引用 强引用是在程序代码之中普遍存在的&#xff0c;类似于“Object obj new Object()”&#xff0c;obj变量引用Object这个对象&#xff0c;就叫做强引用。当内存空间不足&#xff0c;Java虚拟机宁愿抛出OutOfMe…

乐鑫AWS IoT ExpressLink方案,简化物联网设备连接AWS IoT服务

在现代科技迅速发展的今天&#xff0c;物联网&#xff08;IoT&#xff09;已经成为连接物理世界与数字世界的重要桥梁&#xff0c;越来越多的设备开始接入网络&#xff0c;实现智能化控制。 在这个大背景下&#xff0c;乐鑫携手亚马逊&#xff0c;推出了AWS IoT ExpressLink方…

【机器学习】机器学习解决的问题特点、机器学习学的是什么、怎么学、如何构建高效机器学习模型的策略、机器学习的分类以及机器学习、模式识别、数据挖掘和人工智能的区别

引言 机器学习是人工智能的一个重要分支&#xff0c;主要解决的是如何通过算法让机器从数据中自动学习规律和知识&#xff0c;以完成特定任务或解决特定问题。 文章目录 引言一、机器学习解决的是什么样的问题1.2 数据驱动的预测问题1.3 数据理解与挖掘1.4 优化与决策问题1.5 异…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议(带私活)

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

泰迪智能科技携广州华商学院共讨产教融合,校企合作

7月19日&#xff0c;广州华商学院人工智能学院的领导及骨干教师一行莅临泰迪智能科技参观交流&#xff0c;广州华商学院人工智能学院院长助理杨本胜、院长助理洪绍勇、大数据系主任颜远海、金融数学系主任石金诚、人工智能系主任霍永良&#xff0c;以及骨干教师许丽娟、李志青、…

二十、【机器学习】【非监督学习】- 均值漂移 (Mean Shift)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

Electron 渲染进程直接调用主进程的API库@electron/remote引用讲解

背景 remote是个老库&#xff0c;早期Electron版本中有个remote对象&#xff0c;这个对象可以横跨所有进程&#xff0c;随意通信&#xff0c;后来官方认为不安全&#xff0c;被干掉了&#xff0c;之后有人利用Electron的IPC通信&#xff0c;底层通过Promise的await能力&#x…

Text Control 控件教程:使用 .NET C# 中的二维码和条形码增强文档

QR 码和条形码非常适合为文档和 PDF 文件增加价值&#xff0c;因为它们提供轻松的信息访问、验证信息、跟踪项目和提高交互性。条形码可以弥补纸质或数字人类可读文档与网络门户或网络应用程序中的数字信息之间的差距。大多数用户都熟悉 QR 码和条形码&#xff0c;它们在许多过…

Cannot perform upm operation: connect ETIMEDOUT 34.36.199.114:443 [NotFound]

版本&#xff1a;Unity 2018 Windows 问题&#xff1a;打开 Package Manager&#xff0c;加载报错 尝试解决&#xff1a; 删除项目文件里的Packages下的mainfest.json文件&#xff0c;然后重新打开项目&#xff08;X&#xff09;重新登录 Unity 账号&#xff08;X&#xff09…

Http 和 Https 的区别(图文详解)

在现代网络通信中&#xff0c;保护数据的安全性和用户的隐私是至关重要的。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是两种常见的网络通信协议&#xff0c;但它们在数据保护方面的能力存在…

立创梁山派--移植开源的SFUD万能的串行 Flash 通用驱动库

SFUD是什么 关于SFUD库的介绍&#xff0c;其开源链接(gitee,github)已经详细的阐述了. 这里是截取自它的一部分介绍&#xff1a; SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多&#xff0c;各个 Flash 的规格及命令存在差异&#xff0c; SF…