3. 创建一个菜单组件-DeepSeek辅助编程

news/2025/3/14 15:24:30/文章来源:https://www.cnblogs.com/terry841119/p/18772160
在deepseek中输入:
创建一个vue组件 组件实现菜单的功能 需要让调用该组件是可以自定义一些属性:mode:horizontal横向显示/vertical纵向显示,background-color,text-color,active-text-color,model:通过该model绑定菜单/model为MenuItem的数组 MenuItem由这些参数构成:index:唯一标识/控制显示先后顺序,title:标题/显示的菜单标题,disabled:是否禁用,to:url跳转地址,subitem:子菜单model 支持多级菜单 支持菜单图标
deepseek返回的代码:
Menu的代码
<!-- TMenu.vue -->
<template><div class="menu-container":class="[modeClass]":style="containerStyle"><TMenuItemv-for="item in processedMenu":key="item.index":item="item":current-active="activeIndex":depth="0"@item-click="handleItemClick"/></div></template><script setup>import { ref, computed, provide, defineProps, defineEmits } from 'vue'import TMenuItem from './TMenuItem.vue'const props = defineProps({model: {type: Array,required: true},mode: {type: String,default: 'horizontal',validator: v => ['horizontal', 'vertical'].includes(v)},backgroundColor: {type: String,default: '#ffffff'},textColor: {type: String,default: '#303133'},activeTextColor: {type: String,default: '#409eff'}})const emit = defineEmits(['update:modelValue'])// 提供样式变量给子组件provide('menuColors', {backgroundColor: computed(() => props.backgroundColor),textColor: computed(() => props.textColor),activeTextColor: computed(() => props.activeTextColor)})const activeIndex = ref('')const modeClass = computed(() => `menu-${props.mode}`)const containerStyle = computed(() => ({backgroundColor: props.backgroundColor}))// 处理菜单数据const processedMenu = computed(() => {return props.model.map(item => ({ ...item })).sort((a, b) => (a.order || 0) - (b.order || 0))})const handleItemClick = (item) => {activeIndex.value = item.indexif (item.to) {// 这里可以集成路由跳转逻辑console.log('Navigate to:', item.to)}emit('item-click', item)}</script><style scoped>.menu-container {display: flex;transition: all 0.3s;}.menu-horizontal {flex-direction: row;}.menu-vertical {flex-direction: column;}</style>

 

MenuItem的代码
<!-- TMenuItem.vue -->
<template><div class="menu-item":class="[`depth-${depth}`,{ 'is-active': isActive },{ 'is-disabled': item.disabled }]"
      :style="itemStyle"><divclass="menu-item-content"@click="handleClick"><span class="menu-item-title">{{ item.title }}</span><span v-if="hasSubmenu"class="menu-arrow":class="[isSubmenuOpen ? 'arrow-open' : '']">▾</span></div><div v-if="hasSubmenu && isSubmenuOpen"class="submenu":class="[submenuClass]"><t-menu-itemv-for="subItem in sortedSubmenu":key="subItem.index":item="subItem":current-active="currentActive":depth="depth + 1"@item-click="$emit('item-click', $event)"/></div></div></template><script setup>import { computed, inject, ref } from 'vue'const props = defineProps({item: {type: Object,required: true},currentActive: String,depth: {type: Number,default: 0}})const emit = defineEmits(['item-click'])const menuColors = inject('menuColors')const isSubmenuOpen = ref(false)const hasSubmenu = computed(() => props.item.submenu?.length > 0)const sortedSubmenu = computed(() => props.item.submenu?.sort((a, b) => (a.order || 0) - (b.order || 0)) || []) || []const isActive = computed(() => props.currentActive === props.item.index)const itemStyle = computed(() => ({color: isActive.value ? menuColors.activeTextColor : menuColors.textColor}))const submenuClass = computed(() => props.depth === 0 ? 'submenu-root' : '')const handleClick = () => {if (props.item.disabled) returnif (hasSubmenu.value) {isSubmenuOpen.value = !isSubmenuOpen.value} else {emit('item-click', props.item)}}</script><style scoped>.menu-item {position: relative;cursor: pointer;transition: all 0.3s;}.menu-item.depth-0 {padding: 12px 20px;}.menu-item.depth-1 {padding: 8px 30px;}.menu-item.depth-2 {padding: 8px 40px;}.menu-item-content {display: flex;align-items: center;gap: 8px;}.menu-item-title {white-space: nowrap;}.menu-arrow {transition: transform 0.3s;margin-left: auto;}.arrow-open {transform: rotate(180deg);}.submenu {position: absolute;background-color: v-bind('menuColors.backgroundColor');min-width: 160px;box-shadow: 0 2px 12px rgba(0,0,0,0.1);}.menu-vertical .submenu-root {left: 100%;top: 0;}.menu-horizontal .submenu-root {top: 100%;left: 0;}.menu-item.is-disabled {opacity: 0.6;cursor: not-allowed;}.menu-item:hover:not(.is-disabled) {background-color: rgba(0,0,0,0.04);}</style>

 

调用的代码
<template><TMenu:model="menuData"mode="vertical"background-color="#f5f7fa"text-color="#606266"active-text-color="#409eff"@item-click="handleMenuClick"/>
</template><script setup>
import { ref } from 'vue'
import TMenu from './components/TMenu.vue'const menuData = ref([{index: '1',title: '首页',order: 1,to: '/home'},{index: '2',title: '产品中心',order: 2,submenu: [{index: '2-1',title: '手机',submenu: [{ index: '2-1-1', title: '旗舰机型' },{ index: '2-1-2', title: '性价比机型' }]},{index: '2-2',title: '电脑',disabled: true}]},{index: '3',title: '联系我们',order: 3,submenu: [{ index: '3-1', title: '在线客服' },{ index: '3-2', title: '电话联系' }]}
])const handleMenuClick = (item) => {console.log('Clicked menu:', item)
}
</script>

 

然后运行,我们就可以看到deepseek给我们写的这个组件了
0
 

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

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

相关文章

微信支付相关配置

公众号相关配置 地址:https://mp.weixin.qq.com/一、获取用户openid相关配置 二、获取开发者ID(AppID)/开发者密码(AppSecret) 微信支付相关配置 地址:https://pay.weixin.qq.com/需要先申请开通支付产品微信支付相关参数获取: 一:获取商户号(商户号mach_id)三、获取证书…

华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手

通过实际操作,让开发者熟悉如何通过云主机部署DeepSeek,以及如何将DeepSeek与Cherry Studio结合起来帮助我们解决一些实际的问题。本文分享自华为云社区《华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手》,作者:开发者空间小蜜蜂。 1 案例介绍 CherryStudio …

​信创环境元宇宙应用:3种虚拟团队管理工具前瞻测评

随着信息技术的不断发展,信创环境下的元宇宙应用正逐渐成为各行业关注的焦点。在这个虚拟的世界中,虚拟团队的管理变得至关重要。本文将对三种虚拟团队管理工具进行前瞻测评,探讨它们在信创环境元宇宙应用中的优势和潜在挑战。 信创国产化项目管理解决方案 禅道是一款国产的…

VSCode+Linux+GCC编译运行数据结构的C语言程序集

背景 学习数据结构,写了很多C语言程序,这些C语言程序都保存在一个Git仓库中,以章节、实验内容为目录存放,形如:之前一直是通过gcc命令手动编译、运行,但随着程序逐渐复杂,希望简化构建过程,做到一键编译运行,同时支持断点调试。 环境VSCode,安装了C/C++扩展 Linux GC…

​信创项目管理认证解析:从SAFe到PMBOK的5大适配要点

在当今数字化时代,信创项目管理的重要性日益凸显。SAFe(Scaled Agile Framework,规模化敏捷框架)和 PMBOK(Project Management Body of Knowledge,项目管理知识体系)作为两种广泛应用的项目管理方法,如何实现它们之间的适配,以更好地推动信创项目的成功实施,是一个值…

mybatis如何使用注解方式,不使用xml

前言 大家好,我是小徐啊。我们在使用springboot开发的时候,一般是结合mybatis来使用的。而且,我们一般使用mybatis的时候,都是使用xml的文件。 不过,我之前在开发的时候,遇到了使用xml怎么也读取不到,可能是哪里配置的问题。这个时候,我就想到了使用注解的方式写sql,不…

SHP转WKT文件工具

SHP转WKT文件工具 *.shp转成wkt文件工具:将shp数据的图形转换成wkt工具 参数配置:param.yml设置shape路径,路径参数设置:shapeFile: “你的路径”;注:路径请使用"\\"或者’/’ ;避免使用含中文的路径示例: shapeFile: “C:/Users/Administrator/Desktop/wm/wm.s…

美标插头:插片一大一小,上面带孔

过年期间我遇到了一个刚从美国留学回来的朋友,正好在家无聊,我就让她给我讲讲在美国发生的事情,她告诉我去美国一定要带转换插座,因为那边的插头和国内的不一样,插头上的插片一大一小,可以说是很畸形了,可这是为什么呢?她说她刚开始也不懂,后来查了资料才知道,这是因…

MATLAB R2024b 安装教程

MATLAB R2024b 安装教程 软件介绍 MATLAB 是由 “Matrix” 和 “Laboratory” 两个词组合而成,意为“矩阵工厂”,是一款专注于科学计算、数据可视化和交互式程序设计的高科技计算环境。MATLAB 集成了数值分析、矩阵计算、科学数据可视化以及非线性动态系统建模和仿真等强大功…

手把手教如何将若依前后端分离项目在Tomcat下部署教程

如果你想在Tomcat单独部署诺依项目,前提你要配置好诺依相关的环境,比如安装jdk,mysql,redis,maven等环境,并且开发工具能够正常把项目跑起来,部署可自行去诺依官网查看相关教程。 接下来将详细讲解诺依项目部署在Tomcat下运行相关操作:后端部署1.打开开发工具,修改配置与打…

ASE40N25-ASEMI电动工具专用ASE40N25

ASE40N25-ASEMI电动工具专用ASE40N25编辑:ll ASE40N25-ASEMI电动工具专用ASE40N25 型号:ASE40N25 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:40A 漏源击穿电压:250V RDS(ON)Max:70mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

使用echarts创建一个进度条,怎么设置流光效果

使用echarts创建一个进度条,怎么设置流光效果1.引言: 相信大家做大屏都会用到echarts,但是我们是否能把他做些动画效果呢? 那么今天就来介绍一个bar进度条的流光效果。 2.制作过程: 首先:第一步我们先来制作一个进度条:option = {xAxis: {show: false,max: 1,},yAxis: {…