解决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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
JS加载iFrame出现空白问题的解决办法
May 13 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
jquery网页日历显示控件calendar3.1使用详解
Nov 24 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
Jul 27 Javascript
Vue+Element实现网页版个人简历系统(推荐)
Dec 31 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
Aug 31 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
Nov 02 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
第十三节--对象串行化
2006/11/16 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
python实现图书管理系统
2018/03/12 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
python使用tornado实现简单爬虫
2018/07/28 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
Python 用户输入和while循环的操作
2021/05/23 Python
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript