解决antd Form 表单校验方法无响应的问题
作者:Knife_SX 发布时间:2024-05-28 16:00:23
antd 的 表单校验方法包括 validateFields 和 validateFieldsAndScroll
里面可以接收校验字段数组, options, 和一个回调函数
from.validateFields([name, age], {}, (err, val)=> {})
校验全部表单数据
from.validateFields((err, val)=> {}) // 无响应
发现无响应, 无报错, 完全蒙逼了, 排查良久, 添加校验字段后发现可以成功校验, 于是想着大不了我全部手动添加字段名校验, 终于, 错误的原因浮现出来了
from.validateFields([name, age], (err, val)=> {}) // 正常
只要校验我自定义的一个表单组件, 这个方法就会无响应, 原因就是我自定义组件的自定义校验出现了问题
也就是 validator 方法里出现了问题 好好看看你的自定义校验吧
rules: [
{
validator: (rule, value, callback) => {
callback()
},
},
],
补充知识:解决Antd自定义表单验证问题
最近项目中遇到一个表单校验的问题,看官方文档、网上搜索找了好久,终于找到了解决方案。
先阐述一下问题:
项目中的表单需要多图片上传,这个使用Upload组件就OK了,但是表单验证就出现问题了:
1、首先,上传图片项是必须项,不能无图片提交;
2、已上传的图片可以删除;
3、后端要求提交的图片为md5格式,通过上传接口获取图片的md5值,这样就不能直接使用表单提交时获取的 value值,因 为它的值是本地路径,所以我通过model中上传图片获取md5的值存在model的state中 (这个问题是最棘手的)。
解决问题:
1、首先我自定义了一个表单验证方法,因为需要以上传成功的图片为基准。
自定义表单校验方法:
handleCheckImg = (rule, value, callback) =>{
if (value) {
const { aware } = this.props;
const { fileList } = aware;
const newFileList=fileList.map(item => ({...item}));
if (!newFileList) {
callback('请上传相关图片');
} else {
newFileList.length ? callback() : callback('请上传相关图片');
}
}
callback(); // callback方法必须要有,否则会报错
};
在表单中调用:
<FormItem label="上传图片">
{getFieldDecorator('attachment', {
rules: [
{ required: true, message: '请上传相关图片' },
{ validator: this.handleCheckImg },
],
})(
<div className="clearfix">
<Upload {...uploadProps} >
......
</Upload>
</div>
)}
</FormItem>
此时表单的验证规则会调用到自定义的表单验证方法,但是由于验证方法默认是在表单onChange的时候调用,而默认onChange时进行表单验证,在model中用于存放图片md5值的变量还没有进行更新这里就已经进行验证了,这样的验证会导致,即便我已经上传了一张图片,页面上仍然会提示要我上传相关图片,删除图片却不会调用到表单验证。
那要怎么解决?那就让我点击按钮准备submit时进行表单验证吧。
2、通过看文档,表单的getFieldDecorator方法中有个属性validateTrigger可以设置什么时候进行表单验证,默认是onChange。
于是我在方法中添加该属性,设置为onSubmit:
getFieldDecorator('attachment', {
rules: [
{ required: true, message: '请上传相关图片' },
{ validator: this.handleCheckImg },
],
validateTrigger: 'onSubmit', // 设置进行表单验证的时机为onSubmit
initialValue: detail ? detail.imgList : null,
})
这样设置了以后虽然可以正常进行表单验证了,但是,当点击了一次提交按钮后,表单验证过的表单项不会再进行验证。那万一我点击一次提交后,表单中其他表单项有问题,而图片上传没有问题,那我将其他表单项都填好符合验证格式后,删除了图片,再点击提交按钮,表单不会再验证图片上传的表单项,这样就被通过了,不行呀,这是一个bug。
怎么解决呢?那就点击提交的时候,都对所有表单项进行一次验证,无论是否已经验证过的。
3、Antd框架的validateFields方法中有一个force属性可以设置是否对已校验过的表单项再次校验,默认是false。
于是我在该方法中添加这个属性,设置为true。
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields({ force: true }, (err, values) => { // 设置force为true
......
});
};
这样就解决了我的问题。
来源:https://blog.csdn.net/qq_36800820/article/details/101755510


猜你喜欢
- 在这个教材中,我们假定你已经安装了Scrapy。假如你没有安装,你可以参考这个安装指南。我们将会用开放目录项目(dmoz)作为我
- python如何把1变成011.实现头部utf8编码的方法代码2.实现读属性的方法代码3.实现写属性的方法代码4.实现高度的方法代码5.实现
- 较新的pip已经支持list --outdated了,所以记录一下新的方法:pip list --outdated --format=leg
- 一、字符集 character字符 character 是各种文字和符号的总称字符编码 character code 是计算机针对各种符号,
- 最近在使用Testlink时,发现导入的用例是xml格式,且没有合适的工具转成excel格式,xml使用excel打开显示的东西也太多,网上
- 如果在prop中传的值为一个没有使用特殊命名规则的变量如:(type),可以顺利传值:<code class="langua
- 概述在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)
- 如何使用dialog弹窗1.官网示例因为这次是在手机上用的所以就用了vant组件2.第一步引入vant中的dialog组件官网介绍自行选择安
- 之前看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看
- 最简单的关闭一个窗口的方法是点击标题栏上的 x 标志。但是,在下面的例子中,我们将展示如何通过编程来控制关闭窗口。我们将使用PyQt5的信号
- 前言:一直想写一个监控方面的脚本,然后想到了运维这方面的,后来就写了个脚本,下面话不多说了,来一起看看详细的介绍吧。准备:psutil模块(
- discuz注册时,会把密码按一个规则加密。比如我的密码是123456echo md5("123456");
- 1.创建图在tensorflow中,一个程序默认是建立一个图的,除了系统自动建立图以外,我们还可以手动建立图,并做一些其他的操作。下面我们使
- print(X.shape):查看矩阵的行列号print(len(X)):查看矩阵的行数print(X.ndim):查看矩阵的维数1 查看矩
- --取得所有数据库名 包括系统数据库 --SELECT name FROM master.dbo.sysdatabases --取得所有非系
- 1.python 和 pytorch的数据类型区别在PyTorch中无法展示字符串,因此表达字符串,需要将其转换成编码的类型,比如one_h
- 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所
- asp中怎么替换最后一个逗号为空字符串?举例 aaa,bbb,ccc,eee, 这个字符串怎么让最后一个逗号变没,其他的不变啊 ?问题补充:
- 本文实例讲述了Python有序查找算法之二分法。分享给大家供大家参考,具体如下:二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的
- 用vue写业务代码时候,后端大神丢给我一堆数据,要求是做全选,反选功能,然后把用户更改的数据全部返回给他基本思路如果父级选中了,那么父级下面