解决antd Form 表单校验方法无响应的问题


Posted in Javascript onOctober 27, 2020

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值的变量还没有进行更新这里就已经进行验证了,这样的验证会导致,即便我已经上传了一张图片,页面上仍然会提示要我上传相关图片,删除图片却不会调用到表单验证。

解决antd Form 表单校验方法无响应的问题

那要怎么解决?那就让我点击按钮准备submit时进行表单验证吧。

2、通过看文档,表单的getFieldDecorator方法中有个属性validateTrigger可以设置什么时候进行表单验证,默认是onChange。

解决antd Form 表单校验方法无响应的问题

于是我在方法中添加该属性,设置为onSubmit:

getFieldDecorator('attachment', {
 rules: [
 { required: true, message: '请上传相关图片' },
 { validator: this.handleCheckImg },
 ],
 validateTrigger: 'onSubmit', // 设置进行表单验证的时机为onSubmit
 initialValue: detail ? detail.imgList : null,
})

这样设置了以后虽然可以正常进行表单验证了,但是,当点击了一次提交按钮后,表单验证过的表单项不会再进行验证。那万一我点击一次提交后,表单中其他表单项有问题,而图片上传没有问题,那我将其他表单项都填好符合验证格式后,删除了图片,再点击提交按钮,表单不会再验证图片上传的表单项,这样就被通过了,不行呀,这是一个bug。

解决antd Form 表单校验方法无响应的问题

怎么解决呢?那就点击提交的时候,都对所有表单项进行一次验证,无论是否已经验证过的。

3、Antd框架的validateFields方法中有一个force属性可以设置是否对已校验过的表单项再次校验,默认是false。

解决antd Form 表单校验方法无响应的问题

于是我在该方法中添加这个属性,设置为true。

handleSubmit = (e) => {
 e.preventDefault();
 this.props.form.validateFields({ force: true }, (err, values) => { // 设置force为true
 ......
 });
};

这样就解决了我的问题。

解决antd Form 表单校验方法无响应的问题

以上这篇解决antd Form 表单校验方法无响应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
Sep 01 Javascript
jQuery插件实现文字无缝向上滚动效果代码
Feb 25 Javascript
详解Javascript几种跨域方式总结
Feb 27 Javascript
关于axios返回空对象的问题解决
Apr 04 Javascript
Vue渲染函数详解
Sep 15 Javascript
vue-cli webpack2项目打包优化分享
Feb 07 Javascript
Vue组件和Route的生命周期实例详解
Feb 10 Javascript
vue的diff算法知识点总结
Mar 29 Javascript
基于javascript的拖拽类封装详解
Apr 19 Javascript
vue实现图片预览组件封装与使用
Jul 13 Javascript
Antd表格滚动 宽度自适应 不换行的实例
Oct 27 #Javascript
解决Antd Table组件表头不对齐的问题
Oct 27 #Javascript
antd 表格列宽自适应方法以及错误处理操作
Oct 27 #Javascript
js实现简易ATM功能
Oct 27 #Javascript
Antd的table组件表格的序号自增操作
Oct 27 #Javascript
antd-DatePicker组件获取时间值,及相关设置方式
Oct 27 #Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 #Javascript
You might like
php之字符串变相相减的代码
2007/03/19 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python 中的Selenium异常处理实例代码
2018/05/03 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
关于期中考试的反思
2014/02/02 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
集体婚礼策划方案
2014/02/22 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
结对共建协议书
2014/08/20 职场文书
2014年社区工作总结
2014/11/18 职场文书
教师工作态度自我评价
2015/03/05 职场文书
音乐会主持人开场白
2015/05/28 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
python 提取html文本的方法
2021/05/20 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python