vue动态添加表单validateField验证功能实现
作者:totau 发布时间:2023-07-02 17:03:27
标签:vue,添加,表单,validateField,验证
vue动态添加表单validateField验证,代码如下所示:
<template>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<div v-for="(input, index) in inputs" :key="index">
<el-form-item :label="'Name ' + (index + 1)" :prop="'name' + index">
<el-input v-model="input.name" @blur="validateName(index)"></el-input>
</el-form-item>
<el-form-item :label="'Age ' + (index + 1)" :prop="'age' + index">
<el-input v-model.number="input.age" @blur="validateAge(index)"></el-input>
</el-form-item>
</div>
<el-button type="primary" @click="addInput">Add input</el-button>
<el-button type="primary" @click="submitForm">Submit</el-button>
</el-form>
</template>
<script>
export default {
data() {
return {
form: {},
inputs: [{name: '',age: ''}],
rules: {
name0: { required: true, pattern: /^[A-Za-z]+$/, message: 'Name can only contain letters', trigger: 'blur' },
age0: { required: true, pattern: /^\d+$/, message: 'Age can only contain numbers', trigger: 'blur' },
}
}
},
methods: {
addInput() {
const index = this.inputs.length
this.inputs.push({ name: '', age: '' })
this.$set(this.form, `name${index}`, '')
this.$set(this.form, `age${index}`, '')
this.$set(this.rules, `name${index}`, { required: true, pattern: /^[A-Za-z]+$/, message: 'Name can only contain letters', trigger: 'blur' })
this.$set(this.rules, `age${index}`, { required: true, pattern: /^\d+$/, message: 'Age can only contain numbers', trigger: 'blur' })
},
validateName(index) {
this.$refs.form.validateField(`name${index}`)
},
validateAge(index) {
this.$refs.form.validateField(`age${index}`)
},
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
// submit form
} else {
console.log('validation failed')
}
})
}
}
}
</script>
可以使用 Element UI 的表单组件结合 Vue 的动态组件来实现动态添加多组输入框,并对每个输入框进行校验。Element UI 提供了很多内置的校验规则和提示信息,可以方便地应用到表单中。
首先,我们需要在 Vue 实例中声明一个 inputs 数组来存储每个输入组的数据。在添加输入组时,我们只需要向 inputs 数组中添加一个新的对象即可。
在模板中,我们使用 Element UI 的表单组件来渲染输入框,并使用 v-for 指令循环渲染多组输入框。在每个输入框中,我们使用 v-model 指令将输入值绑定到 inputs 数组中的数据属性上。对于 name 和 age 输入框,我们使用 pattern 规则来进行校验,并在 rules 对象中提供了相应的错误提示信息。在 checkNameInput 和 checkAgeInput 方法中,我们调用 $refs.form.validateField 方法来手动触发校验,并将当前输入对象作为参数传递进去。
最后,我们需要在 Vue 实例中声明一个 form 对象来维护表单数据,并将 rules 对象传递给 el-form 组件的 rules 属性。这样,每次输入框的值发生变化时,就会自动触发 Element UI 的校验机制,并显示相应的错误提示信息。
补充:vue动态表单添加表单验证
<el-form ref="conditionListForm" :rules="ConditionListRules" :model="scope.row.conditionListForm">
<el-table
ref="conditionListDia"
:data="scope.row.conditionListForm.conditionListDia"
border
:header-cell-style="background"
style="width: 100%"
size="mini"
>
<el-table-column label="限制条件名称" align="center">
<el-table-column
label="条件组合"
align="center"
size="mini"
min-width="40"
>
<template slot-scope="scopeChild">
<el-form-item :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionRelation' " :rules="ConditionListRules.conditionRelation">
<el-select
v-model="scopeChild.row.conditionRelation"
:disabled="scope.row.conditionListForm.conditionListDia.length > 1 || scope.row.id > 0"
size="mini"
placeholder="请选择"
clearable
style="float:left;width:95%"
@change="showconditionRelation(scopeChild.row.conditionRelation)"
>
<el-option
v-for="item in compositionConditionList"
:key="item.key"
:disabled="item.baseDataStatus==='0'"
:label="item.label"
:value="item.key"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="条件分组"
size="mini"
align="center"
min-width="30"
>
<template slot-scope="scopeChild">
<el-form-item :prop=" 'conditionListDia[' + scopeChild.$index + '].medalConditionClassname' " :rules="ConditionListRules.medalConditionClassname">
<el-select
v-model="scopeChild.row.medalConditionClassname"
:disabled="scope.row.id > 0"
size="mini"
placeholder="请选择"
clearable
style="float:left;width:95%"
@change="defDataClick(scopeChild)"
>
<el-option
v-for="item in fatherNameList"
:key="item.id"
:label="item.medalConditionClassname"
:value="item.id"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="条件"
size="mini"
align="center"
min-width="40"
>
<template slot-scope="scopeChild">
<el-form-item :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionId' " :rules="ConditionListRules.conditionId">
<el-select
v-model="scopeChild.row.conditionId"
size="mini"
:disabled="scope.row.id > 0"
placeholder="请选择"
clearable
style="float:left;width:95%"
@change="getRelationship(scopeChild.row.conditionId,scopeChild.row.medalConditionClassnameList,scopeChild.row)"
>
<el-option
v-for="item in scopeChild.row.medalConditionClassnameList"
:key="item.defId"
:label="item.medalConditionName"
:value="item.defId"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
</el-table-column>
<el-table-column
label="运算关系"
align="center"
size="mini"
min-width="50"
>
<template slot-scope="scopeChild">
<el-form-item :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionOperation' " :rules="ConditionListRules.conditionOperation">
<el-select
v-model="scopeChild.row.conditionOperation"
size="mini"
placeholder="请选择"
:disabled="scope.row.id > 0"
clearable
style="float:left;width:95%"
@change="conditionOperationEmpty(scopeChild.row)"
>
<el-option
v-for="item in scopeChild.row.conditionOperationValueList"
:key="item.key"
:disabled="item.baseDataStatus==='0'"
:label="item.value"
:value="item.key"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="值"
align="center"
size="mini"
min-width="120"
>
<template slot-scope="scopeChild">
<el-form-item v-if="scopeChild.row.medalConditionControlType === '0'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionTrueValueList' " :rules="ConditionListRules.conditionTrueValueList">
<el-select
v-model="scopeChild.row.conditionTrueValueList"
multiple
style="float:left;width:95%"
size="mini"
clearable
placeholder="请选择"
@change="conditionValueEmpty(scopeChild)"
>
<el-option
v-for="item in scopeChild.row.conditionValueList"
:key="item.value"
:label="item.key"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="scopeChild.row.medalConditionControlType == '1'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionValue' " :rules="ConditionListRules.conditionValue">
<el-input
v-model="scopeChild.row.conditionValue"
clearable
placeholder="请输入"
align="center"
style="float:left;"
size="mini"
maxlength="60"
show-word-limit
@blur="conditionValueEmpty(scopeChild)"
/>
</el-form-item>
<el-form-item v-if="scopeChild.row.medalConditionControlType == '2'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionTrueValueList' " :rules="ConditionListRules.conditionTrueValueList">
<el-date-picker
v-model="scopeChild.row.conditionTrueValueList"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
size="mini"
end-placeholder="结束日期"
style="float:left;width:95%"
/>
</el-form-item>
<el-form-item v-if="scopeChild.row.medalConditionControlType === '3'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionValue' " :rules="ConditionListRules.conditionValue">
<el-select
v-model="scopeChild.row.conditionValue"
style="float:left;width:95%"
size="mini"
clearable
placeholder="请选择"
@change="conditionValueEmpty(scopeChild)"
>
<el-option
v-for="item in scopeChild.row.conditionValueList"
:key="item.value"
:label="item.key"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="scopeChild.row.medalConditionControlType === '4'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionTrueValueList' " :rules="ConditionListRules.conditionTrueValueList">
<el-time-picker
v-model="scopeChild.row.conditionTrueValueList"
style="float:left;width:95%"
size="mini"
is-range
clearable
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
format="HH:mm"
@change="conditionValueEmpty(scopeChild)"
/>
</el-form-item>
<el-form-item v-if="scopeChild.row.medalConditionControlType == '5'" :prop=" 'conditionListDia[' + scopeChild.$index + '].conditionValue' " :rules="ConditionListRules.conditionValue">
<el-input-number v-model="scopeChild.row.conditionValue" size="mini" :min="0" label="" @change="conditionValueEmpty(scope)" />
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
min-width="50"
>
<template slot-scope="scopeChild">
<el-button type="text" :disabled="scope.row.id > 0" @click="delCondition(scope.$index,scope.row.conditionListForm.conditionListDia,scopeChild.row,scopeChild.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
ConditionListRules: {
conditionRelation: [
{ required: true, message: '条件组合不能为空', trigger: 'change' }
],
medalConditionClassname: [
{ required: true, message: '条件分组不能为空', trigger: 'change' }
],
conditionId: [
{ required: true, message: '条件不能为空', trigger: 'change' }
],
conditionOperation: [
{ required: true, message: '运算关系不能为空', trigger: 'change' }
],
conditionValue: [
{ required: true, message: '值不能为空', trigger: 'change' }
],
conditionTrueValueList: [
{ required: true, message: '值不能为空', trigger: 'change' }
]
},
主要就是prop的问题,prop要对应到数据。
来源:https://www.cnblogs.com/qutao125/archive/2023/04/06/17293924.html


猜你喜欢
- 使用环境:Win10 x64 Python:3.6.4 SqlServer:2008R2 因为
- 前言extends关键字在TS编程中出现的频率挺高的,而且不同场景下代表的含义不一样,特此总结一下:表示继承/拓展的含义表示约束的含义表示分
- 阅读上一篇:定义网页的语言编码 用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计
- The prompt command reconfigures the default mysql> prompt. The stri
- 原理:TensorFlow使用的求导方法称为自动微分(Automatic Differentiation),它既不是符号求导也不是数值求导,
- 增加中间件可以选择普通模式和LUA脚本模式,建议选择普通模式,实际上不需要控制的那么精确。package Middlewaresimport
- 本文将和大家分享一些从互联网上爬取语料的经验。0x1 工具准备工欲善其事必先利其器,爬取语料的根基便是基于python。我们基于python
- 最近我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个离奇
- 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了。下面我们一起尝试一下爬取内涵段子网站:http://ww
- 1、安装pip install mediapipe2、代码实现# -*- coding: utf-8 -*-""&quo
- 本文实例为大家分享了ADO.NET通用数据库访问类,供大家参考学习,具体内容如下using System;using System.Coll
- 目录1.导入tf.keras2.构建简单模型2.1模型堆叠2.2网络配置3.训练和评估3.1设置训练流程3.2输入Numpy数据3.3tf.
- 随着ajax再网站建设中的的大范围流行,XmlHttp也自然被人们所熟悉。本文介绍了asp任何检测服务器端是否支持xmlhttp组件的方法,
- 真的很重要,栽了个跟头!!!(虽然以前好像知道。。。)print(True or False and False)print((True o
- PDOStatement::setAttributePDOStatement::setAttribute — 设置一个语句属性(PHP 5
- 转自: http://www.qqread.com/mysql/z442108305.html对于程序开发人员而言,目前使用最流行的两种后台
- 在用JS编写动画的时候,经常用会到布局转换,即在运动前将相对定位转为绝对定位,然后执行动画函数。下面给大家分享一个运用原生JS实现的布局转换
- 前言:Requests简介Requests 是使用Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为
- JavaScript中有很多内部属性和方法,在大多数情况下,只有JavaScript引擎才可以访问,但不论什么都是有特例的,在这里就是指Mo
- 在该网站下载你所需要的mysql依赖驱动版本,比如我的QT版本是5.15就下5.15版的 按照你的Qt编译版本和机器位数进行下载,