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

【Vue 3 + Element Plus 实现产品标签的动态添加、删除与回显】


🚀Vue 3 + Element Plus 实现产品标签的动态添加、删除与回显在这里插入图片描述

在后台管理系统中,我们经常需要对表单数据进行动态处理,尤其是类似“产品标签”这样的字段,它需要用户能够灵活添加、删除,并在编辑时自动回显。今天我们就来聊聊如何在 Vue 3 + Element Plus 中实现这一功能。

🛠️ 项目背景

本文案例来自于一个产品表单,包含字段如产品名称、活动时间、联系方式、以及我们今天重点讲的 —— 产品标签

🔧 实现效果

  • 用户可点击“+ 添加产品标签”输入并添加标签;
  • 支持删除已添加的标签;
  • 编辑已有产品时,自动回显之前保存的标签。

💡 核心实现代码解析

1️⃣ 定义响应式变量

import { nextTick, ref, reactive } from 'vue'
import { ElInput } from 'element-plus'const dynamicTags = ref<string[]>([]) // 标签数组
const inputValue = ref('')            // 当前输入的标签内容
const inputVisible = ref(false)       // 控制输入框显示
const InputRef = ref<InstanceType<typeof ElInput>>() // 输入框引用

2️⃣ 显示标签并支持删除

<el-form-item label="产品标签" prop="productsLabel"><el-tagv-for="tag in dynamicTags":key="tag"class="mx-1"closable@close="handleClose(tag)">{{ tag }}</el-tag><el-inputv-if="inputVisible"ref="InputRef"v-model="inputValue"class="ml-1 w-20"@keyup.enter="handleInputConfirm"@blur="handleInputConfirm"/><el-button v-else class="button-new-tag ml-1" @click="showInput">+ 添加产品标签</el-button>
</el-form-item>

3️⃣ 添加标签逻辑

const showInput = () => {inputVisible.value = truenextTick(() => {InputRef.value!.input!.focus()})
}const handleInputConfirm = () => {if (inputValue.value) {dynamicTags.value.push(inputValue.value)formData.value.productsLabel = dynamicTags.value // 同步到表单}inputVisible.value = falseinputValue.value = ''
}

4️⃣ 删除标签逻辑

const handleClose = (tag: string) => {dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1)formData.value.productsLabel = dynamicTags.value // 同步数据
}

5️⃣ 数据回显(编辑时)

当打开弹窗并传入产品 ID 时,从后端获取数据并赋值给标签数组:

if (id) {formData.value = await ProductsApi.getProducts(id)dynamicTags.value = formData.value.productsLabel || []
}

✅ 小结

通过上述方式,我们轻松实现了:

  • 标签的动态添加与删除;
  • 输入框的显隐控制;
  • 标签的同步绑定与数据回显。

该方式通用性强,特别适用于任何需要动态标签管理的场景。


🌟 标签功能扩展:数量限制 + 防重复 + 校验非空

✅ 一、限制标签数量(如最多 5 个)

添加一个判断逻辑,在添加标签前先判断当前数量是否超过上限:

const MAX_TAGS = 5const handleInputConfirm = () => {const val = inputValue.value?.trim()if (!val) {message.warning('标签不能为空')inputVisible.value = falsereturn}if (dynamicTags.value.length >= MAX_TAGS) {message.warning(`最多添加 ${MAX_TAGS} 个标签`)} else if (dynamicTags.value.includes(val)) {message.warning('标签不能重复')} else {dynamicTags.value.push(val)formData.value.productsLabel = dynamicTags.value // 同步数据}inputVisible.value = falseinputValue.value = ''
}

✅ 二、防止重复标签

上面的逻辑里其实已经包含了去重的判断:

if (dynamicTags.value.includes(val)) {message.warning('标签不能重复')
}

✅ 三、标签不能为空或纯空格

同样通过 .trim() 判断输入有效性:

const val = inputValue.value?.trim()
if (!val) {message.warning('标签不能为空')inputVisible.value = falsereturn
}

✨ 提示消息组件

message.warning() 是 Element Plus 的 $message 组件调用,你需要确保有导入:

const message = useMessage()

或者换成:

import { ElMessage } from 'element-plus'
// 使用时 ElMessage.warning('...')

🧪 小技巧:展示当前标签数量

你也可以在 UI 上加点提示,比如:

<small class="text-gray-500">已添加 {{ dynamicTags.length }}/{{ MAX_TAGS }} 个标签</small>

相关文章:

【Vue 3 + Element Plus 实现产品标签的动态添加、删除与回显】

&#x1f680;Vue 3 Element Plus 实现产品标签的动态添加、删除与回显 在后台管理系统中&#xff0c;我们经常需要对表单数据进行动态处理&#xff0c;尤其是类似“产品标签”这样的字段&#xff0c;它需要用户能够灵活添加、删除&#xff0c;并在编辑时自动回显。今天我们就…...

【NLP】23.小结:选择60题

Question 1: What does the fixed lookup table in traditional NLP represent? A. A table of one‐hot vectors B. A table of pre‐trained dense word embeddings C. A dictionary of word definitions D. A table of n-gram counts Answer (中文): 答案选 B。传统NLP中“…...

IntelliJ 配置(二)配置相关类库(2)LineMarkerProvider

一、介绍 LineMarkerProvider 是 IntelliJ 平台插件开发中的一个接口&#xff0c;它的作用是在编辑器左侧的“行标记区域”&#xff08;就是代码行号左边那一栏&#xff09;添加各种图标、标记或导航链接。比如Java 类中看到的&#xff1a; 小绿色三角形&#xff08;可以点击运…...

从零开始学java--线性表

数据结构基础 目录 数据结构基础 线性表 顺序表 链表 顺序表和链表的区别&#xff1a; 栈 队列 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表中的元素个数就是线性表的长度&#xff0c;表的起始位置称为表头&am…...

AD917X系列JESD204B MODE7使用

MODE7特殊在F8&#xff0c;M4使用2个复数通道 CH0_NCO10MHz CH1_NCO30MHZ DP_NCO50MHz DDS1偏移20MHz DDS2偏移40MHz...

Spring Cloud之远程调用OpenFeign最佳实践

目录 OpenFeign最佳实践 问题引入 Feign 继承方式 创建Module 引入依赖 编写接口 打Jar包 服务提供方 服务消费方 启动服务并访问 Feign 抽取方式 创建Module 引入依赖 编写接口 打Jar包 服务消费方 启动服务并访问 服务部署 修改pom.xml文件 观察Nacos控制…...

【Python爬虫】详细入门指南

目录 一、简单介绍 二、详细工作流程以及组成部分 三、 简单案例实现 一、简单介绍 在当今数字化信息飞速发展的时代&#xff0c;数据的获取与分析变得愈发重要&#xff0c;而网络爬虫技术作为一种能够从互联网海量信息中自动抓取所需数据的有效手段&#xff0c;正逐渐走入…...

Win11系统 VMware虚拟机 安装教程

Win11系统 VMware虚拟机 安装教程 一、介绍 Windows 11是由微软公司&#xff08;Microsoft&#xff09;开发的操作系统&#xff0c;应用于计算机和平板电脑等设备 。于2021年6月24日发布 &#xff0c;2021年10月5日发行 。 Windows 11提供了许多创新功能&#xff0c;增加了新…...

打造AI应用基础设施:Milvus向量数据库部署与运维

目录 打造AI应用基础设施&#xff1a;Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库&#xff1f;1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…...

对于客户端数据存储方案——SQLite的思考

SQLite 比较适合进行本地小型数据的存储&#xff0c;在功能丰富性和并发能力上不如 MySQL。 数据类型差异 SQLite 使用动态类型系统&#xff1a;只有 5 种基本存储类 (NULL, INTEGER, REAL, TEXT, BLOB) 类型亲和性&#xff1a;SQLite 会将声明的列类型映射到最接近的存储类 …...

【深度学习与大模型基础】第11章-Bernoulli分布,Multinoulli分布

一、Bernoulli分布 1. 基本概念 想象你抛一枚硬币&#xff1a; 正面朝上&#xff08;记为 1&#xff09;概率是 p&#xff08;比如 0.6&#xff09;。 反面朝上&#xff08;记为 0&#xff09;概率是 1-p&#xff08;比如 0.4&#xff09;。 这就是一个Bernoulli分布&…...

基于Windows通过nginx代理访问Oracle数据库

基于Windows通过nginx代理访问Oracle数据库 环境说明&#xff1a; 生产环境是一套一主一备的ADG架构服务器&#xff0c;用户需要访问生产数据&#xff0c;基于安全考虑&#xff0c;生产IP地址不能直接对外服务&#xff0c;所以需要在DMZ部署一个前置机&#xff0c;并在该前置机…...

北斗和GPS信号频率重叠-兼容与互操作

越来越多的同学们发现北斗三代信号的B1C&#xff0c;B2a信号居然和美国GPS L1,L5处在同样频率上&#xff1f; 为什么美国会允许这样的事情发生&#xff1f;同频率难道不干扰彼此的信号吗&#xff1f; 思博伦卫星导航技术支持文章TED 这事得从2006年联合国成立全球卫星导航系统…...

python爬虫:喜马拉雅案例(破解sign值)

声明&#xff1a; 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 根据上一篇文章&#xff0c;我们破解了本网站的&#xff0c;手机号和密码验证&#x…...

如何高效查询订单销售情况与售罄率:从SQL到架构优化的全流程设计

在电商平台、SaaS多租户系统中,订单数据作为核心数据之一,承载了关键的运营指标,如销售额、商品售罄率、订单转化等。随着数据量的持续增长,如何在大数据量条件下快速、稳定地获取统计信息,成为系统设计的重点之一。 本文将从查询目标分析入手,结合数据库设计优化与典型…...

机器学习:让数据开口说话的科技魔法

在人工智能飞速发展的今天&#xff0c;「机器学习」已成为推动数字化转型的核心引擎。无论是手机的人脸解锁、网购平台的推荐系统&#xff0c;还是自动驾驶汽车的决策能力&#xff0c;背后都离不开机器学习的技术支撑。那么&#xff0c;机器学习究竟是什么&#xff1f;它又有哪…...

51单片机波特率与溢出率的关系

1. 波特率与溢出率的基本关系 波特率(Baud Rate)表示串口通信中每秒传输的位数(bps),而溢出率是定时器每秒溢出的次数。在51单片机中,波特率通常通过定时器的溢出率来生成。 公式关系: 波特率=溢出率/​分频系数 其中,分频系数与定时器的工作模…...

Java 8 CompletableFuture:异步编程的利器与最佳实践

目录 1. 创建异步任务 1.1 使用默认线程池 1.2 使用自定义线程池 2. 异步回调处理 2.1 thenApply 和 thenApplyAsync 2.2 thenAccept 和 thenAcceptAsync 2.3 thenRun 和 thenRunAsync 3. 异常处理 3.1 whenComplete 和 whenCompleteAsync 3.2 handle 和 handleAsync…...

Podman与行业趋势分析 ——兼论与Docker的对比及未来发展方向

1. Podman核心概念与架构解析 1.1 定义与定位 Podman&#xff08;Pod Manager&#xff09;是由Red Hat主导开发的开源容器引擎&#xff0c;遵循OCI&#xff08;Open Container Initiative&#xff09;标准&#xff0c;专注于提供无守护进程&#xff08;Daemonless&#xff09…...

摄影测量——单像空间后方交会

空间后方交会的求解是一个非线性问题&#xff0c;通常采用最小二乘法进行迭代解算。下面我将详细介绍具体的求解步骤&#xff1a; 1. 基本公式&#xff08;共线条件方程&#xff09; 共线条件方程是后方交会的基础&#xff1a; 复制 x - x₀ -f * [m₁₁(X-Xₛ) m₁₂(Y-…...

ros2_01

note01 ROS2和ROS最大的区别中间件 中间件&#xff1a; 介于某两个或者多个节点中间的组件&#xff1b;提供多个节点中间通信&#xff1b; ROS1&#xff1a;中间件是ROS组织自己基于TCP机制建立的&#xff0c;随着现在传感器的升级&#xff0c;数据量越来越大&#xff0c;原…...

C++中的高阶函数

C中的高阶函数 高阶函数是指可以接受其他函数作为参数或返回函数作为结果的函数。在C中&#xff0c;有几种方式可以实现高阶函数的功能&#xff1a; 1. 函数指针 #include <iostream>int add(int a, int b) { return a b; } int subtract(int a, int b) { return a -…...

计算机视觉与深度学习 | 钢筋捆数识别

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 钢筋捆数 1、初始结果2、处理效果不佳时的改进方法‌1、预处理增强2、后…...

L3-027 可怜的复杂度(纯暴力)

暴力解答&#xff0c;肯定超时&#xff0c;因为我刚开始把所有答案&#xff0c;存到了ans这个vector里面了&#xff0c;然后进行枚举情况&#xff0c;后面发现因为这个阶数很高的时候&#xff0c;就会直接炸内存&#xff0c;所以我直接选择了在dfs里面进行统计答案&#xff0c;…...

基于RV1126开发板的人脸姿态估计算法开发

1. 人脸姿态估计简介 人脸姿态估计是通过对一张人脸图像进行分析&#xff0c;获得脸部朝向的角度信息。姿态估计是多姿态问题中较为关键的步骤。一般可以用旋转矩阵、旋转向量、四元数或欧拉角表示。人脸的姿态变化通常包括上下俯仰(pitch)、左右旋转(yaw)以及平面内角度旋转(r…...

鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】

前期说明 配置&#xff1a;2台鲲鹏32C2 2Atlas300I duo&#xff0c;之前看网上文档&#xff0c;目前GPUstack只支持910B芯片&#xff0c;想尝试一下能不能310P也部署试试&#xff0c;毕竟华为的集群软件要收费。 系统&#xff1a;openEuler22.03-LTS 驱动&#xff1a;24.1.rc…...

【C#】CAN通信的使用

在C#中实现CAN通信通常需要借助第三方库或硬件设备的驱动程序&#xff0c;因为C#本身并没有直接内置支持CAN通信的功能。以下是一个关于如何使用C#实现CAN通信的基本指南&#xff0c;包括所需的步骤和常用工具。 1. 硬件准备 要进行CAN通信&#xff0c;首先需要一个支持CAN协…...

火山引擎旗下的产品

用户问的是火山引擎旗下的产品&#xff0c;我需要详细列出各个类别下的产品。首先&#xff0c;我得确认火山引擎有哪些主要业务领域&#xff0c;比如云计算、大数据、人工智能这些。然后&#xff0c;每个领域下具体有哪些产品呢&#xff1f;比如云计算方面可能有云服务器、容器…...

Elasticsearch 故障转移及水平扩容

一、故障转移 Elasticsearch 的故障转移&#xff08;Failover&#xff09;机制是其高可用性的核心&#xff0c;通过分布式设计、自动检测和恢复策略确保集群在节点故障时持续服务。 1.1 故障转移的核心组件 组件作用Master 节点管理集群状态&#xff08;分片分配、索引创建&…...

机器学习中 提到的张量是什么?

在机器学习中, 张量(Tensor) 是一个核心数学概念,用于表示和操作多维数据。以下是关于张量的详细解析: 一、数学定义与本质 张量在数学和物理学中的定义具有多重视角: 多维数组视角 传统数学和物理学中,张量被定义为多维数组,其分量在坐标变换时遵循协变或逆变规则。例…...