React实践总结Form表单即时校验输入值(基于Antd Design)

Posted zldmy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React实践总结Form表单即时校验输入值(基于Antd Design)相关的知识,希望对你有一定的参考价值。

1.判断输入值的长度

1.1 根据输入值的类型不同,限制输入值长度不同。

此时需要使用自定义的校验规则。 如长度要求:中文输入5位,非中文10位
 1 <FormItem label="名称" ...formItemLayout>
 2     getFieldDecorator(‘name‘, 
 3         rules: [
 4             
 5                 required: true,
 6                 message: "名称不能为空",                                           
 7             ,                    
 8             
 9                 validator: async (rule, value, callback) => 
10                     const reg = new RegExp("[\\\\u4E00-\\\\u9FFF]+","g"); //正则校验
11                     if(reg.test(value) && value.length > 5)
12                         callback("中文最多5位");
13                     else if(value.length > 10)
14                         callback("非中文最多10位");
15                      else
16                         callback();
17                                                                                                                 
18                 
19             
20         ],
21     )(
22         <Input placeholder="这里输入名称" allowClear />,
23     )
24 </FormItem>

  1.2 不对输入类型做区分,统一设置长度。

如:

  • 输入值长度最少5位,最大10位; 使用现有规则:min ,max
  • 长度只能为10位。 使用现有规则:len
 1 <FormItem label="名称" ...formItemLayout>
 2     getFieldDecorator(‘name‘, 
 3         rules: [   
 4             //输入值长度最少5位,最大10位               
 5             
 6                min:3
 7                message: "最小5位",    
 8             ,                    
 9             
10                 max:15
11                message: "最大10位",    
12             
13 
14             //输入值长度需要为10位
15 //            
16 //               len:10
17 //               message: "输入长度不足10位",    
18 //            
19 
20         ],
21     )(
22         <Input placeholder="这里输入名称" allowClear />,
23     )
24     </FormItem>

 2. 判断输入值的有效性

方式一: 最简单使用getFieldDecorator中的rules验证

rules中定义校验规则,message为校验不通过时的提示文字
1 getFieldDecorator(‘inputContent‘, 
2             rules: [
3               required: true, 
4               message: ‘请输入内容!‘,
5             ],
6           )(
7             <Input />
8 )

 方式二: 通过validateStatus+help 同时来控制。

antd提供了validateStatus,help,hasFeedback 等属性,你可以不需要使用 Form.create 和 getFieldDecorator,自己定义校验的时机和内容。
  • validateStatus: 校验状态,可选 ‘success‘, ‘warning‘, ‘error‘, ‘validating‘。
  • hasFeedback:用于给输入框添加反馈图标。
  • help:设置校验文案。
注: 这种校验方法有一个不足之处,就是不使用getFieldDecorator的话没办法设置字段名,获取输入的值的时候不能用getFieldsValue和setFieldsValue等方法对表单进行赋值和取值。
技术图片

 例子:同时监测输入框内容是否为空和是否有效

  • 设置了validateStatus,help,这个就不能使用方式三的validator方式校验了,会冲突,使得validator不生效。
  • 且文案也只会显示help设置的提示文案("名称不能为空"),原先规则设置的message文案(message: "名称需要输入!")也不会生效。所以提示文案的变化也就只能用help来设置。
 1 <FormItem ...formItemLayout
 2     label="名称"
 3     validateStatus=this.state.showError ? "error" : (   
 4         this.state.inputEmpty? "error":"")
 5     help=this.state.showError ? "输入名称不符合要求" : (
 6         this.state.inputEmpty? "名称不能为空":"")
 7 >
 8     getFieldDecorator(‘name‘, 
 9         initialValue: "",
10         rules: [
11             
12                 required: true,
13                 message: "名称需要输入!",
14             ,
15                 validator: async (rule, value, callback) => 
16                     if(!value)
17                         this.setState(
18                             inputEmpty: true
19                         )
20                     else
21                         this.setState(
22                             inputEmpty: false
23                         )
24                                                                      
25                     
26                 
27                                                  
28         ],
29 
30     )(
31         <Input
32             placeholder="这里输入名称"
33             allowClear
34             onBlur=this.handleInputChange />
35     )
36     
37 </FormItem>

 输入框的handleInputChange方法可自行实现,用来校验输入值是否符合要

方式三:使用getFieldDecorator的validator自定义校验

ant.design内部使用了async-validator,通过阅读async-validator的文档,了解到每个rule其实都是可以定制validator。validator是个函数,其中有三个参数很重要:rule,value和callback。
  • rule:这个是规则,可以不用
  • value:这个是要验证的值
  • callback:这个是回调函数,验证出错后可以把错误信息作为参数调用callback

举例:

 1 <FormItem
 2     label="标签"
 3     labelCol= span: 6 
 4     wrapperCol= span: 14 >
 5     getFieldDecorator(‘tags‘, 
 6         rules: [
 7             required: true,
 8             type:‘array‘,
 9             message:‘必填‘,
10         ,
11             validator(rule, values, callback)
12                 if(values && values.length>0)
13                     values.map((value,i)=>
14                         if(value.name.length > 16 )
15                             callback(`第$i+1个标签超过16个字符`);
16                         else if(value.name.length == 0)    
17                             callback(`第$i+1个标签不能为空`);
18                         else    
19                             callback();
20                         
21                     );
22                 else
23                     callback();
24                 
25             
26         ],
27     )(
28         <MyTag />
29     )
30 </FormItem>
 
还可以写成:
 1 <FormItem
 2     label="标签"
 3     labelCol= span: 6 
 4     wrapperCol= span: 14 >
 5     getFieldDecorator(‘tags‘, 
 6         rules: [
 7             required: true,
 8             type:‘array‘,
 9             message:‘必填‘,
10         ,
11             validator: async (rule, value, callback) => 
12                   callback(‘Something wrong!‘);
13                 
14             
15         ],
16     )(
17         <MyTag />
18     )
19 </FormItem>

 还有种写法: 单独写一个handleValidator方法来处理

 1 handleValidator = (rule, val, callback) => 
 2         if (!val) 
 3             callback();
 4         
 5         let validateResult = ...;  // 自定义规则
 6         if (!validateResult) 
 7             callback(‘请输入正确的内容!‘);
 8         
 9         callback();
10     
11     
12     
13 getFieldDecorator(‘validator‘, 
14     rules: [
15         required: true,
16         message: ‘请输入内容‘
17     , 
18         validator: this.handleValidator
19     ]
20 )(
21     <input />
22 )

 注意:一个 Form.Item 建议只放一个被 getFieldDecorator 装饰过的 child,当有多个被装饰过的 child 时,help required validateStatus 无法自动生成。此时可用下面一种方法校验。


 

 
 
 
 

以上是关于React实践总结Form表单即时校验输入值(基于Antd Design)的主要内容,如果未能解决你的问题,请参考以下文章

js校验表单后提交表单的三种方法总结

js校验表单后提交表单的三种方法总结(转)

react之form表单工具:formik+yup

React-Antd4的Form表单校验

React 自定义表单校验规则

react+antd:Form表单校验不提示错误信息