HTML开发 Vue2.x + Element-UI 动态生成表单项并添加表单校验

基于vue2.x 和element-ui 动态生成表单项并添加表单校验;

1、需求问题

如下图,项目有个需求,点击添加按钮,新增一行设备信息,且每项信息必填;

需求图片

2、代码

看到这个需求,首先想到要使用v-for的形式进行处理每一行设备信息;但是,之前没有搞过动态生成表单项并添加表单校验(最近几年又回归iOS开发,H5开发只是临时协助其他部门开发),自己先尝试写了下,但是表单校验死活不起作用;问了部门H5大佬,结果都是没有写过类似页面,怎么办,网上搜索呗;果然网上不少内容,但是在我项目中依旧是表单校验不起作用,只好一一尝试修改,最终搞定;

特别需要注意的一点是,想要其作用,不能直接给el-form直接添加rules,动态绑定,需要给具体el-form-item添加对应的rules

有效代码示例:

 <el-form ref="form" v-loading="isLoading" class="list-container" :model="form" label-width="0"><div v-for="(item, index) in form.devices" :key="index" class="list-item-container"><el-form-item :prop="'devices.' + index + '.name'" :rules="rules.name"><el-input v-model="item.name" class="list-item-input" size="small" maxlength="20" clearable placeholder="设备名称" /></el-form-item><el-form-item :prop="'devices.' + index + '.quantity'" :rules="rules.quantity"><el-input v-model="item.quantity" class="list-item-input-samll" size="small" maxlength="20" clearable placeholder="设备数量" /></el-form-item><el-form-item><el-button class="danger" size="small" type="text" @click="handleDelete(index)">删除</el-button></el-form-item></div></el-form>

无效代码示例:

 <el-form ref="form" v-loading="isLoading" class="list-container" :model="form" :rules="rules" label-width="0"><div v-for="(item, index) in form.devices" :key="index" class="list-item-container"><el-form-item :prop="'devices.' + index + '.name'"><el-input v-model="item.name" class="list-item-input" size="small" maxlength="20" clearable placeholder="设备名称" /></el-form-item><el-form-item :prop="'devices.' + index + '.quantity'"><el-input v-model="item.quantity" class="list-item-input-samll" size="small" maxlength="20" clearable placeholder="设备数量" /></el-form-item><el-form-item><el-button class="danger" size="small" type="text" @click="handleDelete(index)">删除</el-button></el-form-item></div></el-form>

废话少数,直接上成品代码;

<template><div class="ledger-tab-page"><el-button type="primary" @click="handleAdd">{{ '添加' }}</el-button><el-form ref="form" v-loading="isLoading" class="list-container" :model="form" label-width="0"><div v-for="(item, index) in form.devices" :key="index" class="list-item-container"><el-form-item :prop="'devices.' + index + '.name'" :rules="rules.name"><el-input v-model="item.name" class="list-item-input" size="small" maxlength="20" clearable placeholder="设备名称" /></el-form-item><el-form-item :prop="'devices.' + index + '.quantity'" :rules="rules.quantity"><el-input v-model="item.quantity" class="list-item-input-samll" size="small" maxlength="20" clearable placeholder="设备数量" /></el-form-item><el-form-item :prop="'devices.' + index + '.km_mileage'" :rules="rules.km_mileage"><span class="list-item-text">DK</span><el-input v-model="item.km_mileage" class="list-item-input-samll" size="small" maxlength="3" clearable placeholder="安装里程" /></el-form-item><el-form-item :prop="'devices.' + index + '.metre_mileage'" :rules="rules.metre_mileage"><span> + </span><el-input v-model="item.metre_mileage" class="list-item-input-samll" size="small" maxlength="3" clearable placeholder="安装里程" /></el-form-item><el-form-item :prop="'devices.' + index + '.validity_date'" :rules="rules.validity_date"><el-date-picker v-model="item.validity_date" type="datetime" size="small" class="list-item-date" placeholder="请选择有效期" default-time="00:00:00" /></el-form-item><el-form-item><el-button class="danger" size="small" type="text" @click="handleDelete(index)">删除</el-button></el-form-item></div></el-form></div>
</template>
<script>import _ from 'lodash'export default {components: {BwtButton},props: {info: {type: Array,default: () => {return []}}},data() {return {isLoading: false,form: {devices: []},rules: {// 'devices.*.name': [//   { required: true, message: '设备名称为必填项', trigger: 'blur' }// ],name: [{ required: true, message: '设备名称为必填项', trigger: 'blur' }],quantity: [{ required: true, message: '设备数量为必填项', trigger: 'blur' },{ type: 'number', message: '设备数量必须为数字', trigger: 'blur' },{ pattern: /^[1-9]\d{0,3}$/, message: '请输入正确的设备数量', trigger: 'blur' }],km_mileage: [{ required: true, message: '安装里程为必填项', trigger: 'blur' },{ type: 'number', message: '安装里程必须为数字', trigger: 'blur' },{ pattern: /^[1-9]\d{0,2}$/, message: '请输入正确的里程范围', trigger: 'blur' }],metre_mileage: [{ required: true, message: '安装里程为必填项', trigger: 'blur' },{ type: 'number', message: '安装里程必须为数字', trigger: 'blur' },{ pattern: /^[1-9]\d{0,2}$/, message: '请输入正确的里程范围', trigger: 'blur' }],validity_date: [{ required: true, message: '请选择有效期', trigger: 'blur' }]}}},computed: {},watch: {'info': function(newVal) {if (newVal) {// 处理详情回显this.form.devices = newVal || []}}},mounted() {},methods: {// 清空表单内容(供外部调用)resetFields() {this.form.devices = []},// 表单校验(供外部调用)formValidate() {// 校验:如果name为空,不允许提交return new Promise((resolve, reject) => {try {this.$refs.form.validate((valid) => {if (!valid) {this.$message.error('请完善设备信息')}resolve(valid)})} catch (error) {reject(error)}})},// 获取当前页面的表单数据formData() {return _.cloneDeep(this.form.devices)},// 新增handleAdd() {// 增加一行,const item = {name: '',quantity: '',km_mileage: '',metre_mileage: '',validity_date: ''}this.form.devices.push(item)},// 删除handleDelete(index) {this.form.devices.splice(index, 1)}}
}
</script>
<style scoped lang="scss">
.ledger-tab-page {margin: 20px 0;width: 100%;
}.list-container {margin-top: 10px;max-height: 400px;overflow-y: auto !important;
}.list-item-container {display: flex;width: 100%;
}.list-item-input {width: 200px !important;margin-right: 10px;
}.list-item-text {margin: 0 5px;
}.list-item-input-samll {width: 100px !important;margin-right: 5px;margin-left: 5px;
}.list-item-date {width: 200px !important;margin-right: 10px;
}</style>

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

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

相关文章

springboot集成uid-generator生成分布式id

一、简介 uid-generator是由百度技术部开发,GitHub地址 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器 Snowflake算法 Snowflake算法描述&#xff1a;指定机器 & 同一时刻 & 某一并发序列&#xff0c;是唯一的。据此可生成一个64 bits的唯一ID&#x…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中&#xff0c;一般使用 windows 系统进行开发&#xff0c;但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试&#xff08;win10特定版本或win11才能安装 docker&#xff09;&#xff0c;为了方便还需要在 windows 系统中通过 SQLyog …

Python轻量级嵌入式关系数据库之apsw使用详解

概要 在现代应用开发中,数据库是一个非常重要的组成部分。SQLite 是一个轻量级的嵌入式关系数据库管理系统,被广泛应用于各种应用程序中。APSW(Another Python SQLite Wrapper)库是一个专门用于访问 SQLite 数据库的 Python 包,它提供了 SQLite 所有的功能,并且比标准库…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格&#xff08;…

各种空气能热泵安装图

空气能热泵安装图 循环式空气能热泵安装图 直热循环式空气能热泵安装图 泳池空气能热泵安装图 循环式水源热泵热安装系统原理图 直热循环式水源热泵安装系统图 空气水源热泵安装图

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

如何将本地项目上传到GitHub

在软件开发过程中&#xff0c;将本地项目上传到GitHub是一个非常重要的步骤。它不仅可以帮助你备份代码&#xff0c;还可以让你与团队成员共享和协作开发。本文将详细介绍如何将本地项目上传到GitHub。 前提条件 已安装Git。如果还没有安装&#xff0c;请参考Git官网进行下载…

【linux】信号(三)

本章节将会围绕信号处理进行展开讲解 目录 回顾一下&#xff1a;历史问题&#xff1a;地址空间&#xff1a;键盘的输出如何被检测到&#xff1a;持续更新... 回顾一下&#xff1a; 信号处理也就是信号递达 我们说过递达时一种有3种行为 默认行为忽略行为自定义行为 历史问…

JVM之【字节码/Class文件/ClassFile 内容解析】

说在前面的话 字节码/Class文件/ClassFile 均为同一概念 Java语言:跨平台的语言(write once,run anywhere) 当Java源代码成功编译成字节码后&#xff0c;如果想在不同的平台上面运行&#xff0c;则无须再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有…

28-LINUX--I/O复用-epoll

一.epoll概述 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、poll 有很大差异。首 先&#xff0c;epoll 使用一组函数来完成任务&#xff0c;而不是单个函数。其次&#xff0c;epoll 把用户关心的文件描述 符上的事件放在内核里的一个事件表中。从而无需像…

xshell远程无法链接上VM的centos7

1、现象如下&#xff0c; 2.解决办法&#xff1a;查证后发现这个默认的设置为vmnet0 3.参考文章&#xff1a;Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连不上是什么原因-CSDN博客

QT C++(QT控件 QPushButton,QRadioButton,QCheckBox)

文章目录 1. QPushButton 普通按钮2. QRadioButton 单选按钮3. QCheckBox 复选按钮 1. QPushButton 普通按钮 QPushButton中的重要属性 text&#xff1a;按钮中的文本icon&#xff1a;按钮的图标iconSize&#xff1a;按钮中图标的尺寸shortCut&#xff1a;按钮对应的快捷键&a…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的&#xff0c;即使CPU没有执行程序&#xff0c;也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量&#xff0c;防止编译器优化&#xff0c; #define __IO volati…

53.ReentrantLock原理

ReentrantLock使用 ReentrantLock 实现了Lock接口&#xff0c; 内置了Sync同步器继承了AbstractQueuedSynchronizer。 Sync是抽象类&#xff0c;有两个实现NonfairSync非公平&#xff0c;FairSync公平。 所以ReentrantLock有公平锁和非公平锁。默认是非公平锁。 public sta…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录&#xff1a;一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站&#xff1a;Python — 简洁之美 第二站&#xff1a;JavaScript — 网页的魔法 第三站&#xff1a;Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…

读书笔记:左耳听风

程序员如何用技术变现 我完全没有必要通过打工听人安排而活着&#xff0c;而是反过来通过在公司工作提高自己的技能&#xff0c;让自己可以更为独立和自由地生活。 因而&#xff0c;在工作当中&#xff0c;对于那些没什么技术含量的工作&#xff0c;我基本上就像是在学生时代那…

Java 的循环

Java 有三种循环&#xff1a;for&#xff0c;while&#xff0c;do while。 for 基本语法&#xff1a; for (循环变量初始化; 循环条件; 循环变量迭代){循环语句; }程序示例&#xff1a; public static void main(String[] args) {for (int i 0, j 0; i < 3; i, j--) {…

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

FJSP:烟花算法(FWA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、烟花算法介绍 参考文献&#xff1a; Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. 二、烟花算法求解FJSP 2.1FJSP模型介绍 柔性作业车间调度问题(Flexible …