当前位置: 首页 > article >正文

从用户爱好到商品属性:手把手教你用 Vue3 + Element Plus 的 el-tag 搭建动态标签管理系统

从用户爱好到商品属性手把手教你用 Vue3 Element Plus 的 el-tag 搭建动态标签管理系统在当今数据驱动的应用开发中标签系统已成为用户画像构建、内容分类和商品属性管理的重要工具。无论是社交平台中的用户兴趣标签还是电商系统中的商品属性标记一个灵活高效的标签管理系统都能显著提升用户体验和数据管理效率。本文将带你从零开始使用Vue3和Element Plus的el-tag组件构建一个功能完整的动态标签管理系统。1. 项目环境搭建与基础配置在开始构建标签管理系统前我们需要搭建一个基于Vue3和Element Plus的开发环境。以下是详细步骤创建Vue3项目npm init vuelatest tag-manager cd tag-manager npm install安装Element Plusnpm install element-plus全局引入Element Plus在main.js中import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vue const app createApp(App) app.use(ElementPlus) app.mount(#app)提示如果项目需要按需导入以减少打包体积可以使用unplugin-vue-components插件但本文为简化流程采用全局引入方式。2. 基础标签展示与数据绑定el-tag组件的基本使用非常简单但结合Vue3的响应式特性我们可以构建出动态变化的标签系统。基础标签展示template div classtag-container el-tag篮球/el-tag el-tag typesuccess足球/el-tag el-tag typeinfo羽毛球/el-tag /div /template响应式数据绑定使用Vue3的refscript setup import { ref } from vue const tags ref([篮球, 足球, 羽毛球, 游泳]) /script template div classtag-container el-tag v-for(tag, index) in tags :keyindex classmx-1 {{ tag }} /el-tag /div /template样式优化.tag-container { display: flex; flex-wrap: wrap; gap: 8px; padding: 20px; }3. 实现标签的CRUD完整交互一个完整的标签管理系统需要支持增删改查(CRUD)功能。下面我们逐步实现这些交互。3.1 标签删除功能el-tag提供了内置的删除功能只需设置closable属性并处理close事件el-tag v-for(tag, index) in tags :keyindex closable closehandleClose(index) {{ tag }} /el-tagconst handleClose (index) { tags.value.splice(index, 1) }3.2 标签新增功能实现标签新增需要结合Element Plus的对话框组件el-button typeprimary clickshowAddDialog添加标签/el-button el-dialog v-modeldialogVisible title添加新标签 width30% el-input v-modelnewTagName placeholder请输入标签名称 / template #footer el-button clickdialogVisible false取消/el-button el-button typeprimary clickaddTag确定/el-button /template /el-dialogconst dialogVisible ref(false) const newTagName ref() const showAddDialog () { dialogVisible.value true newTagName.value } const addTag () { if (newTagName.value.trim()) { tags.value.push(newTagName.value.trim()) dialogVisible.value false } }3.3 标签编辑功能编辑功能需要记录当前编辑的标签索引el-tag v-for(tag, index) in tags :keyindex closable closehandleClose(index) clickeditTag(index) {{ tag }} /el-tag el-dialog v-modeleditDialogVisible title编辑标签 width30% el-input v-modeleditingTag / template #footer el-button clickeditDialogVisible false取消/el-button el-button typeprimary clickconfirmEdit确定/el-button /template /el-dialogconst editDialogVisible ref(false) const editingTag ref() const editingIndex ref(-1) const editTag (index) { editingIndex.value index editingTag.value tags.value[index] editDialogVisible.value true } const confirmEdit () { if (editingTag.value.trim()) { tags.value[editingIndex.value] editingTag.value.trim() editDialogVisible.value false } }4. 高级功能实现分类与过滤4.1 标签分类管理在实际应用中我们经常需要对标签进行分类。可以通过扩展标签数据结构来实现const tagCategories ref({ hobbies: [篮球, 足球, 游泳], skills: [Vue, React, Node.js], traits: [细心, 耐心, 责任心] })div v-for(tags, category) in tagCategories :keycategory h3{{ category }}/h3 el-tag v-for(tag, index) in tags :keyindex closable closeremoveTag(category, index) {{ tag }} /el-tag el-button sizesmall clickshowAddDialog(category)/el-button /div4.2 标签搜索过滤实现标签搜索功能可以提升用户体验el-input v-modelsearchQuery placeholder搜索标签... clearable / div v-for(tags, category) in filteredTags :keycategory h3{{ category }}/h3 el-tag v-for(tag, index) in tags :keyindex {{ tag }} /el-tag /divconst searchQuery ref() const filteredTags computed(() { if (!searchQuery.value) return tagCategories.value const result {} Object.keys(tagCategories.value).forEach(category { const filtered tagCategories.value[category].filter(tag tag.toLowerCase().includes(searchQuery.value.toLowerCase()) ) if (filtered.length) { result[category] filtered } }) return result })5. 数据持久化与API集成5.1 本地存储实现对于简单的应用可以使用localStorage实现数据持久化// 保存标签数据 const saveTags () { localStorage.setItem(tagManagerData, JSON.stringify(tagCategories.value)) } // 加载标签数据 const loadTags () { const saved localStorage.getItem(tagManagerData) if (saved) { tagCategories.value JSON.parse(saved) } } // 在组件挂载时加载数据 onMounted(() { loadTags() }) // 在数据变化时保存 watch(tagCategories, () { saveTags() }, { deep: true })5.2 模拟API调用在实际项目中通常会与后端API交互const fetchTags async () { try { const response await fetch(/api/tags) tagCategories.value await response.json() } catch (error) { console.error(获取标签失败:, error) } } const saveTagsToServer async () { try { await fetch(/api/tags, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(tagCategories.value) }) } catch (error) { console.error(保存标签失败:, error) } }5.3 性能优化建议当标签数量较多时可以考虑以下优化措施虚拟滚动只渲染可视区域内的标签防抖搜索减少搜索时的频繁渲染批量操作减少频繁的API调用import { debounce } from lodash-es const debouncedSearch debounce((query) { searchQuery.value query }, 300)

相关文章:

从用户爱好到商品属性:手把手教你用 Vue3 + Element Plus 的 el-tag 搭建动态标签管理系统

从用户爱好到商品属性:手把手教你用 Vue3 Element Plus 的 el-tag 搭建动态标签管理系统 在当今数据驱动的应用开发中,标签系统已成为用户画像构建、内容分类和商品属性管理的重要工具。无论是社交平台中的用户兴趣标签,还是电商系统中的商品…...

Unity UGUI Canvas组件:从基础渲染到高级适配的实战解析

1. Canvas组件:UI系统的基石 第一次接触Unity UGUI系统时,我被Canvas组件搞得晕头转向。记得当时做了一个简单的血条UI,在不同设备上显示效果天差地别——在PC上完美显示,到了手机上却变得模糊不清。后来才发现,问题出…...

如何增加RAC节点_addnode.sh脚本执行与实例扩展全流程

addnode.sh执行失败主因是网络与权限未对齐:需验证SSH免密、/etc/hosts双向解析、GI用户一致性;CRS启动失败多因OCR/Voting磁盘权限或路径问题;实例未注册需手动srvctl add/start;连接ORA-12514系监听缺静态注册。addnode.sh 执行…...

渗透测试必备:SQLmap 超详细使用指南,SQL 注入从入门到精通

01、SQLmap简介 Sqlmap是一款开源的渗透测试工具 🚀下载及安装 下载地址:http://sqlmap.org/ windows或mac下载第一个,linux下载第二个 kali默认自带sqlmap不需要安装 解压刚下载好的压缩包后,重命名为sqlmap 移动到python目…...

Docker沙箱隔离失效的7个隐性漏洞:从内核命名空间到cgroup v2的深度诊断与修复

第一章:Docker沙箱隔离失效的底层机理与风险全景Docker 的隔离能力并非源于虚拟化,而是依赖 Linux 内核的命名空间(Namespaces)和控制组(cgroups)两大机制。当这些内核原语被绕过、误配或存在漏洞时&#x…...

Loom响应式转型不是选择题:2024年高并发Java系统必须完成的3项技术对齐(附迁移ROI测算表)

第一章:Loom响应式转型不是选择题:2024年高并发Java系统必须完成的3项技术对齐(附迁移ROI测算表) Java Loom 项目已随 JDK 21 正式进入生产就绪阶段,其虚拟线程(Virtual Threads)与结构化并发&a…...

IBM LSF社区版安装后必做的5件事:从通信协议切换到开机自启动配置

IBM LSF社区版安装后必做的5件事:从通信协议切换到开机自启动配置 当你完成IBM LSF社区版的基础安装后,真正的挑战才刚刚开始。一个"能跑"的集群和一个"好用"的集群之间,往往隔着几个关键配置步骤。本文将带你完成从基础…...

向量搜索不是加个Vector列就完事!EF Core 10六大易错点曝光,87%开发者在生产环境踩过坑

第一章:Entity Framework Core 10 向量搜索扩展 面试题汇总核心能力与适用场景 Entity Framework Core 10 原生不支持向量搜索,但通过官方预览包 Microsoft.EntityFrameworkCore.Vector(随 EF Core 10.0.0-preview7 引入)可集成 P…...

告别手动维护!用DataX-Web搞定MySQL到ClickHouse的增量同步(附时间戳配置)

基于DataX-Web的MySQL到ClickHouse增量同步实战指南 1. 数据同步的自动化革命 在数据驱动的时代,企业每天都要处理海量数据的流转与分析。传统的数据同步方式往往依赖手动脚本,不仅效率低下,还容易出错。我曾亲眼见证一家电商企业因为手动同步…...

宜选影票API从工具变生态你知道吗 这波趋势真的能挖到大流量!

原来它早已经不是当初那个单纯的技术接口了几年前提起电影票API,大部分人想到的就是一个用来查影讯、买门票的技术工具。对接进来就是为了给自家平台补个功能,没人会想着靠它赚多少钱。现在呢?整个逻辑全变了。现在的电影票API,早…...

LinkSwift网盘直链下载助手:掌握高效下载技术实现网盘文件极速获取

LinkSwift网盘直链下载助手:掌握高效下载技术实现网盘文件极速获取 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...

计算机毕业设计:Python农产品销售智能分析与可视化系统 Flask框架 数据分析 可视化 机器学习 数据挖掘 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

零代码文本分析:3步完成专业级内容挖掘的完整指南

零代码文本分析:3步完成专业级内容挖掘的完整指南 【免费下载链接】khcoder KH Coder: for Quantitative Content Analysis or Text Mining 项目地址: https://gitcode.com/gh_mirrors/kh/khcoder 面对海量文本数据,如何快速提取有价值的信息&…...

VoiceFixer:如何用AI一键修复任何受损语音文件?

VoiceFixer:如何用AI一键修复任何受损语音文件? 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾经因为录音质量太差而无法听清重要内容?老旧录音的噪音、会…...

手把手教你用GD32E230调试SSD2828:从硬件补晶振到SPI引脚调换的踩坑实录

GD32E230与SSD2828硬件调试实战:从晶振补焊到SPI引脚优化的完整指南 当RGB信号需要转换为MIPI接口时,SSD2828这颗转换芯片往往成为工程师的首选方案。搭配GD32E230这类高性价比MCU,理论上应该能快速搭建起显示转换系统——直到你发现原理图上…...

三菱FX3SA的ST语言实战:手把手教你实现Modbus CRC校验

1. 为什么Modbus通信离不开CRC校验? 在工业自动化领域,Modbus RTU协议就像设备之间的"普通话",而CRC校验则是确保对话准确无误的"校对员"。我曾在多个现场项目中遇到过因校验错误导致的通信故障——设备明明在线&#xf…...

告别点灯:用STM32CubeIDE和HAL库,给你的SSD1306 OLED做个动态仪表盘

用STM32CubeIDE和HAL库打造SSD1306 OLED动态仪表盘 在嵌入式开发中,OLED屏幕因其高对比度、低功耗和快速响应等特性,成为数据显示的理想选择。本文将带你从零开始,使用STM32CubeIDE和HAL库,为SSD1306 OLED屏幕开发一个功能丰富的动…...

从仿真到综合:手把手拆解Verilog中always@(*)与assign的真实差异(附Testbench调试技巧)

从仿真到综合:手把手拆解Verilog中always(*)与assign的真实差异(附Testbench调试技巧) 在数字IC设计领域,Verilog作为硬件描述语言的代表,其语法细节往往直接影响设计质量。always(*)和assign作为描述组合逻辑的两种主…...

AI概念“脱水”指南:从LLM到A2A,看懂大模型技术演进脉络!

本文深入剖析了AI领域从LLM、Prompt到Function Calling、MCP、Skill及A2A等核心概念的技术演进史,旨在为读者梳理清晰的脉络。文章首先介绍了LLM的统计学模型基础,随后详细阐述了Prompt、Context、Agent、RAG等概念如何扩展大模型能力,并通过…...

PX4定点漂移别急着调参!先学会用Flight Review分析飞行日志定位问题

PX4定点漂移问题深度诊断:用Flight Review从数据中揪出真凶 无人机在定点模式下出现水平漂移,就像汽车在平坦路面上无故偏离车道一样令人困扰。许多飞手的第一反应是盲目调整控制器参数,这往往治标不治本。真正的高手会先打开飞行日志&#x…...

避坑指南:ESP32连接SPI SD卡模块的5个常见问题与解决方法(MicroPython版)

ESP32连接SPI SD卡模块的5个典型问题排查与优化实践(MicroPython实战篇) 当你在ESP32项目中使用MicroPython操作SPI接口的SD卡模块时,是否遇到过文件系统突然无法挂载,或是读写速度慢得令人抓狂的情况?这些看似简单的硬…...

AI合规官崛起:GDPR 3.0时代软件测试从业者的新机遇与新挑战

从技术执行到合规保障的角色演变在数据驱动的数字化浪潮中,欧盟《通用数据保护条例》(GDPR)及其演进版本(业界俗称GDPR 3.0)正以前所未有的深度和广度重塑全球技术格局。随着人工智能(AI)技术渗…...

开发者被动收入流:3个自动化方案

面向软件测试从业者的专业实践指南在追求职业发展的道路上,许多软件测试工程师将大量精力投入到发现缺陷、编写脚本和保障质量中,却常常陷入“用时间换金钱”的线性增长困境。然而,随着技术工具与平台生态的成熟,一种新的可能性正…...

职业导师选择指南:避免无效辅导

——软件测试从业者的专业避坑与精准匹配手册在技术迭代以月甚至以周为单位的软件测试领域,职业导师被普遍视为加速成长的“捷径”。然而,一个残酷的现实是:并非所有的指导关系都能带来正向收益。一次无效的辅导,不仅浪费了宝贵的…...

3分钟掌握百度网盘提取码智能获取:baidupankey终极使用指南

3分钟掌握百度网盘提取码智能获取:baidupankey终极使用指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源提取码而烦恼吗?每次遇到需要密码的分享链接,你是否都要在多个…...

Flutter 鸿蒙应用离线模式实战:无网络也能流畅使用

Flutter 鸿蒙应用离线模式实战:无网络也能流畅使用 欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net📄 文章摘要 本文为 Flutter for OpenHarmony 跨平台应用开发任务 34 实战教程,完整实现应用离线模式功…...

给DSP新手:用TMS320F28335的PIE中断,从“肚子痛”到“手被割伤”都管起来

给DSP新手:用TMS320F28335的PIE中断,从“肚子痛”到“手被割伤”都管起来 想象一下,你正在医院急诊室值班。突然,一个病人捂着肚子冲进来喊"胃痛",紧接着又有人举着流血的手指说"被割伤了"。作为医…...

用Arduino搞定维特JY61P姿态传感器:从串口数据解析到欧拉角获取(附完整代码)

Arduino实战:JY61P姿态传感器数据解析与欧拉角计算全指南 刚拿到JY61P姿态传感器时,最让人头疼的就是如何从那一串串十六进制数据中提取出可用的姿态信息。作为一款性价比极高的六轴传感器模块,JY61P集成了三轴加速度计和三轴陀螺仪&#xff…...

海思3516a OSD水印实战:用SDL_ttf+FreeType2生成动态文字叠加(附完整代码)

海思3516a OSD水印实战:SDL_ttfFreeType2动态文字叠加全解析 在安防监控和嵌入式视频处理领域,实时叠加动态文字信息(如时间戳、设备编号或环境数据)是刚需功能。海思3516a芯片作为行业主流方案,其MPP媒体处理平台提供…...

第二篇:Nacos服务注册与发现原理

第二篇:Nacos服务注册与发现原理关键词:Nacos、服务注册、服务发现、心跳机制、健康检查、Distro协议、Spring Cloud、负载均衡、长连接、gRPC摘要 服务注册与发现是微服务架构的神经系统,它决定了服务之间能否高效、可靠地找到彼此。Nacos 作…...