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

Vue.js中使用Element UI实现动态表单项管理及验证

在Vue.js项目中,表单是与用户交互的重要部分,特别是在需要动态管理表单项的场景下,如何优雅地实现添加、删除、上移、下移及验证功能变得尤为重要。本文将详细介绍如何使用Element UI来实现一个包含动态表单项管理以及验证功能的表单。

效果图如下

一、项目背景

假设我们正在开发一个活动管理系统,其中一个功能是为活动添加多条路线信息,每条路线包含路线名称、可参加人数和路线详情。用户需要能够动态地添加、删除、调整路线顺序,并且需要对所有表单项进行验证。

二、实现步骤
  1. 项目初始化

    首先,确保你的Vue项目已经安装了Element UI。如果未安装,可以通过以下命令进行安装:

    npm install element-ui --save
     

    然后在main.js中引入Element UI:

    import Vue from 'vue'; 
    import ElementUI from 'element-ui'; 
    import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI);

  2. 模板结构

    在组件的template部分,使用Element UI的el-form、el-descriptions、el-row、el-col、el-form-item、el-input等组件来构建表单。特别地,使用v-for指令来动态渲染表单项,并使用slot插槽来添加“新增”按钮。

    <template> <!-- 省略了部分代码,详细代码见文末 --> </template>
  3. 数据定义

    在data函数中定义表单数据form和验证规则rules。form中包含activityTravelLines数组,用于存储路线信息。rules中定义了表单项的验证规则。

    data() {  return {  form: {  activityTravelLines: [  {  name: "",  limitNumber: "",  lineDetail: "",  rulesId: 0,  },  ],  //其他字段  },  arrayFieldRulesId: 0,  rules: {  //其他验证规则  },  };  
    },

  4. 初始化数据

    在created钩子中,调用initData方法初始化数据。如果有初始化数据(如通过接口获取),则遍历activityTravelLines数组,为每一项添加rulesId,并更新验证规则。

    created() {  this.initData();  this.updateRules(); // 更新验证规则  
    },  
    methods: {  initData() {  // 省略了部分代码,详细代码见文末  },  // 其他方法...  
    }
  5. 动态管理表单项

    提供addItem、removeItem、moveUp、moveDown方法来实现表单项的添加、删除、上移、下移功能。每次操作后,都需要调用updateRules方法来更新验证规则。

    methods: {  // 省略了部分代码,详细代码见文末  addItem() {  // 省略了部分代码,详细代码见文末  },  removeItem(index) {  // 省略了部分代码,详细代码见文末  },  moveUp(index) {  // 省略了部分代码,详细代码见文末  },  moveDown(index) {  // 省略了部分代码,详细代码见文末  },  // 其他方法...  
    }
  6. 表单验证

    在submit方法中,使用this.$refs.form.validate方法来验证表单。如果验证通过,则执行提交操作。

    methods: {  // 省略了部分代码,详细代码见文末  submit() {  this.$refs["form"].validate((valid) => {  if (valid) {  //你的提交代码  console.log(this.form, "提交form表单");  }  });  },  
    }
  7. 样式定义

    使用SCSS来定义表单的样式,确保表单项之间的间距和布局合理。

    <style lang="scss" scoped>  
    .btnCont {  display: flex;  justify-content: space-between;  align-items: center;  margin-bottom: 5px;  .titleIndexCont {  font-family: PingFang SC, PingFang SC;  font-weight: 400;  font-size: 20px;  color: #333333;  }  
    }  
    </style>
三、完整代码
<template><div class="container"><el-form ref="form" :model="form" :rules="rules" label-width="120px"><el-descriptions title="路线信息" :column="2"><template slot="extra"><el-button type="primary" @click="addItem" size="mini">新 增</el-button></template></el-descriptions><divv-for="(item, index) in form.activityTravelLines":key="item.rulesId"><div class="btnCont"><div class="titleIndexCont">{{ "路线" + (index + 1) }}</div><div><el-buttontype="danger"icon="el-icon-delete"size="mini"@click="removeItem(index)"></el-button><el-buttontype="success"icon="el-icon-top"size="mini"@click="moveUp(index)"></el-button><el-buttontype="success"icon="el-icon-bottom"size="mini"@click="moveDown(index)"></el-button></div></div><el-row><el-col :span="12"><el-form-itemlabel="路线名称:":prop="`activityTravelLines.${index}.name`"><el-input v-model="item.name"></el-input></el-form-item></el-col><el-col :span="12"><el-form-itemlabel="可参加人数":prop="`activityTravelLines.${index}.limitNumber`"><el-inputv-model="item.limitNumber"type="number":min="0"></el-input></el-form-item></el-col></el-row><el-form-itemlabel="路线详情:":prop="`activityTravelLines.${index}.lineDetail`"><el-inputv-model="item.lineDetail"type="textarea"placeholder="请输入内容"maxlength="300":rows="5"show-word-limit></el-input></el-form-item></div><!-- 其他el-form-item --></el-form><div class="footer"><el-button type="primary" @click="submit">确 定</el-button></div></div>
</template>
<script>
export default {data() {return {form: {activityTravelLines: [{name: "",limitNumber: "",lineDetail: "",rulesId: 0,},],//其他字段},arrayFieldRulesId: 0,rules: {//其他验证规则},};},created() {this.initData();this.updateRules(); // 更新验证规则},mounted() {},methods: {initData() {//如果有初始化数据,要遍历form.activityTravelLines,在每一项里面添加rulesIdif (this.id) {//假设getTravelDetail是你的详情接口getTravelDetail(this.id).then((res) => {this.form = res?.data ?? {};this.form.activityTravelLines = res?.data?.activityTravelLines ?? [];this.form.activityTravelLines.map((item, index) => {item.rulesId = index;});this.arrayFieldRulesId = this.form.activityTravelLines.length - 1;this.updateRules(); // 更新验证规则});}},// 添加表单项addItem() {this.arrayFieldRulesId++;this.form.activityTravelLines.push({name: "",limitNumber: "",lineDetail: "",rulesId: this.arrayFieldRulesId,});this.updateRules(); // 更新验证规则},// 删除表单项removeItem(index) {if (this.form.activityTravelLines.length == 1) {this.$message({ message: "不能小于一条路线", type: "warning" });return;}this.form.activityTravelLines.splice(index, 1);this.updateRules(); // 更新验证规则},// 上移表单项moveUp(index) {if (index > 0) {const movedItem = this.form.activityTravelLines.splice(index, 1)[0];this.form.activityTravelLines.splice(index - 1, 0, movedItem);this.updateRules(); // 更新验证规则}},// 下移表单项moveDown(index) {if (index < this.form.activityTravelLines.length - 1) {const movedItem = this.form.activityTravelLines.splice(index, 1)[0];this.form.activityTravelLines.splice(index + 1, 0, movedItem);this.updateRules(); // 更新验证规则}},// 更新验证规则updateRules() {// 为每个表单项添加验证规则this.form.activityTravelLines.forEach((item, index) => {this.rules[`activityTravelLines.${index}.name`] = [{ required: true, message: "路线名称不能为空", trigger: "blur" },];this.rules[`activityTravelLines.${index}.limitNumber`] = [{ required: true, message: "可参加人数不能为空", trigger: "blur" },];});},submit() {this.$refs["form"].validate((valid) => {if (valid) {//你的提交代码console.log(this.form, "提交form表单");}});},},
};
</script>
<style lang="scss" scoped>
.btnCont {display: flex;justify-content: space-between;align-items: center;margin-bottom: 5px;.titleIndexCont {font-family: PingFang SC, PingFang SC;font-weight: 400;font-size: 20px;color: #333333;}
}
</style>
四、总结

本文详细介绍了如何在Vue.js项目中使用Element UI实现一个包含动态表单项管理以及验证功能的表单。通过动态渲染表单项、管理表单项的顺序、以及进行表单验证,我构建了一个灵活且功能强大的表单组件。希望这篇文章能帮助你在项目中更好地处理类似的需求。

相关文章:

Vue.js中使用Element UI实现动态表单项管理及验证

在Vue.js项目中&#xff0c;表单是与用户交互的重要部分&#xff0c;特别是在需要动态管理表单项的场景下&#xff0c;如何优雅地实现添加、删除、上移、下移及验证功能变得尤为重要。本文将详细介绍如何使用Element UI来实现一个包含动态表单项管理以及验证功能的表单。 效果…...

一插U盘就提示格式化?原因、恢复与预防全攻略

一、现象直击&#xff1a;U盘插入电脑即提示格式化 在日常的工作与生活中&#xff0c;U盘作为重要的数据存储和传输工具&#xff0c;被广泛应用于各类场景。然而&#xff0c;有时当我们满怀期待地将U盘插入电脑时&#xff0c;却会遭遇一个令人头疼的问题——系统弹出提示框&am…...

云电脑使用教程标准版

云电脑&#xff0c;也称为云桌面&#xff0c;是一种通过互联网连接远程服务器&#xff0c;使用虚拟桌面环境来执行计算任务的技术。川翔云电脑通过创建软件镜像&#xff0c;让用户能够快速启动并使用预配置的软件和资料&#xff0c;提供高效且经济的云服务。相较于公有云服务&a…...

浏览器服务端文件下载控制(安全阻止、文件浏览器打开还是下载行为控制)

文章目录 简介Chrome已阻止不安全内容下载PDF直接打开txt、xml、js文件被自动打开了而不是下载阿里OSS设置response header阿里OSS修改metadata 简介 随着浏览器的发展&#xff0c;有很多安全方面的限制&#xff0c;对我们的文件下载行为产生了很大的影响。 在JavaScript下载…...

机器学习——量子机器学习

量子机器学习: 未来的机器学习方法 量子计算和机器学习的结合为计算科学带来了前所未有的前景。量子机器学习(QML)正在迅速发展&#xff0c;目标是利用量子计算的优势来处理传统计算机无法高效解决的问题。本文将深入探讨量子机器学习的基本概念、量子计算的关键技术、具体的量…...

[Linux] 创建可以免密登录的SFTP用户

本文主要包含: 创建新用户创建密钥对用于免密登录新用户将新建用户改造为SFTP用户为SFTP上传数据设置限速 1. 创建新用户 sudo useradd sftp_user sudo passwd sftp_user # 输入密码2. 创建密钥对 参考这篇文章 [Linux] 生成 PEM 密钥对实现服务器的免密登录 3. 将新建用户…...

【部署篇】Redis-03主从模式部署(源码方式安装)

一、准备主机 主从模式只是解决了数据备份容灾并不能解决单点故障问题&#xff0c;生产环境中需要在主从模式基础上增加哨兵&#xff0c;实现主节点宕机时自动将其中一个重节点设置为新的主节点。 主机IP角色说明192.168.128.31master&#xff0c;主节点可读写。192.168.128…...

C/C++语言基础--C++四大类型转换讲解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 通过前面几节课&#xff0c;我们学习了抽象、封装、继承、多态、异常等概念&#xff0c;这一篇我们将继续学习C的类型转换&#xff0c;和C语言还有很大区别的&#xff1b;在本节课最后&#xff0c;也简要说…...

KafKa 集群【docker compose】

文章目录 主机准备部署编辑 docker-compose.ymlcontrollerbroker生成cluster_id 一篇完整的 docker-compose.yml 文件查看集群状态使用 kafka-ui 查看拉取 kafka-ui添加集群查看集群状态 使用命令行查看 配置讲解controllerbroker 主机准备 IPcontroller idbroker id192.168.1…...

【工具篇】MLU运行XInference部署手册

文章目录 前言一、平台环境准备二、代码下载三、安装部署1.正常pip 安装 四、运行结果展示1.如果界面404或没有东西请这样做2.运行效果 前言 Xorbits Inference&#xff08;Xinference&#xff09;是一个功能强大、用途广泛的库&#xff0c;旨在为语言、语音识别和多模态模型提…...

计算机网络:数据链路层 —— 扩展共享式以太网

文章目录 共享式以太网共享式以太网存在的问题在物理层扩展以太网扩展站点与集线器之间的距离扩展共享式以太网的覆盖范围和站点数量 在链路层扩展以太网网桥的主要结构网桥的基本工作原理透明网桥自学习和转发帧生成树协议STP 共享式以太网 共享式以太网是当今局域网中广泛采…...

平安养老险深圳分公司:创新养老服务,深入践行金融为民

党的二十届三中全会《决定》提出&#xff1a;“积极发展科技金融、绿色金融、普惠金融、养老金融、数字金融&#xff0c;加强对重大战略、重点领域、薄弱环节的优质金融服务。” 为经济社会发展提供高质量服务&#xff0c;更好满足人民日益增长的美好生活需要&#xff0c;金融…...

静态站点生成器哪家强?

有一种方法&#xff0c;让你写好文档后&#xff0c;快速地让同事、用户和合作伙伴看到&#xff0c;这就是静态站点生成器。 静态站点生成器是一种软件&#xff0c;用于创建不需要服务器端脚本的网站。这些网站由纯HTML文件组成&#xff0c;可能还包括CSS和JavaScript来增强功…...

从0开始部署优化虚拟机

一&#xff0c;vm workstation 安装 CentOS-7 忽略 二、查看虚拟机IP ip address 得到 192.168.196.128/24 宿主机进行Ping测试 C:\Users\Administrator>ping 192.168.196.128正在 Ping 192.168.196.128 具有 32 字节的数据: 来自 192.168.196.128 的回复: 字节32 时间…...

录屏有道, 四款必备录屏工具推荐!

制作教程视频、游戏直播或是远程会议记录等都需要录屏&#xff0c;那么到底应该怎么录屏呢&#xff1f;接下来就给大家介绍几个好用的录屏工具 Foxit REC 直达链接&#xff1a;www.foxitsoftware.cn/REC/ 操作教程&#xff1a;立即获取 Foxit REC以其强大的功能、简洁的界面…...

5G NR:UE初始接入信令流程浅介

UE初始接入信令流程 流程说明 用户设备&#xff08;UE&#xff09;向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU。IN…...

探索 Spring AI:Java 开发者的 AI 应用开发新利器

在当今这个由人工智能驱动的时代&#xff0c;AI 技术正在以前所未有的速度改变着我们的工作和生活方式。对于 Java 开发者来说&#xff0c;将 AI 能力集成到他们的应用程序中&#xff0c;已经成为了一个迫切的需求。阿里云开源的 Spring AI Alibaba 框架&#xff0c;正是为了满…...

Linux历史

Linux 于 1991 年由芬兰学生 Linus Torvalds 作为个人项目开始&#xff0c;旨在创建一个新的免费操作系统内核。在其历史发展中&#xff0c;Linux 内核经历了持续的增长。自 1991 年首次发布源代码以来&#xff0c;Linux 内核从少量的 C 语言文件&#xff0c;且受限于禁止商业发…...

C++ 方法积累

std::numeric_limits<UInt32>::max()placement new 用于控制分配空间 PostingListInMemory * posting_list arena.alloc<PostingListInMemory>();new (posting_list) PostingListInMemory();/// placement new;PostingListInMemory & operator(const Posting…...

区块链-智能合约Solidity编程

文章目录 一、ubuntu安装二、FISCO BCOS安装五、 WeBASE安装5.1 WeBASE简介5.2 节点前置服务搭建5.3 调用HelloWorld合约 七、Solidity极简入门7.1. 值类型7.2. 变量数据存储和作用域7.3. 函数7.4 控制流7.5 数组&映射7.6 结构体7.7 修饰符7.8 事件7.9 面向对象7.10 抽象合…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...