【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 无法自动生成。此时可用下面一种方法校验。

原文地址:https://www.cnblogs.com/zldmy/p/11441866.html

时间: 2024-08-04 00:06:48

【React实践总结】Form表单即时校验输入值(基于Antd Design)的相关文章

ant design form表单的时间处理

ant design form表单的时间处理 用ant design开发程序时,会碰到时间的字段,效果如下: 那么该怎么处理呢?可以在表单中使用如下代码: import { DatePicker } from 'antd' import Moment from 'moment' <FormItem label="开始时间" {...formItemLayout}> { getFieldDecorator('sdate', { initialValue: item.sdate

react之form表单工具:formik+yup

从网上搜到的form表单解决方案如下: 1.uform,地址:https://uformjs.org/#/MpI2Ij/dNFzFyTb UForm 和核心特性: 基于标准 JSON Schema 协议,数据化构建表单 基于 rxjs 对表单内部的副作用做统一管理,轻松解决各种复杂联动校验场景 支持各种表单布局方案 支持可视化构建表单 支持自定义组件扩展 分布式状态管理,表单性能更高 不足:基于styled-components来开发的,涉及到的自定义样式主要是Form和FormItem层面上的

简约的form表单校验插件

前言 网上有好多form表单校验插件,包括jquery的表单检验插件,这些中好多插件功能很齐全强大,提示方式很酷,很美观好看.本想拿来用,但是发现几个问题: 1.使用不方便.校验规则繁多,调用校验函数难记忆. 2.提示方式固定.一般插件给出固定的几种提示方式,但是实际中,不同系统都有自己的页面风格样式,有自己的提示方式,插件自带的一般用不上. 因此,我最终没有采用这些插件,以免用后出现难以修改或实现的情况. 如果一种校验插件能避免以上两个问题最好了,方便使用,提示方式自定义 ,所以自己做了一个简

应用二:Vue之ElementUI Form表单校验

  表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基础用法进行整理说明~ 如下代码是Form表单校验的demo示例: <template> <div id="demo"> <el-dialog title="表单校验示例" :close-on-click-modal="false" :visible.sync="dialogVisible" width=&q

vue+iview的form表单校验总结

这篇文章时关于如何使用iview的form表单校验.主要学习如何使用form校验(以校验文字长度为例),以及如何动态添加校验规则和异步校验. 1.为需要校验的表单添加form标签 <!--注意: ref/rules/model/prop等属性是必须的--> <Form res="foemRef" :rules="formRules" :model="formData" v-if="liveNode">

form表单的密码是否一致校验功能

这是form类表单,自定义的form表单,需要重写钩子函数 """ forms类表单 """ # 校验密码是否一致 from django.core.exceptions import ValidationError from django import forms class RegForm(forms.Form): username = forms.CharField( max_length=16, label='用户名', label_su

12-js校验form表单和event对象学习

js校验form表单: <html> <head> <title><html> <head> <title>js校验form表单</title> <meta charset="UTF-8"/> <!--声明css代码域--> <style type="text/css"> /*设置背景图片*/ body{ background-image: url

基于Bootstrap+jQuery.validate Form表单验证实践

项目结构 : github 上源码地址:https://github.com/starzou/front-end-example    点击打开 1.form 表单代码 [html] view plaincopy <!DOCTYPE html> <html> <head> <title>Bootstrap Form Template</title> <meta charset="utf-8" /> <meta

form表单那点事儿(上) 基础篇

做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了form表单常用的属性 属性名 属性值 描述 action 一个url地址 指定表单提交到的地址 method `GET` , `POST` 表单将以此种方法提交到服务器 target `_self` 当前页面 `_blank` 每次在新窗口打开 `blank` 每次在同一个新窗口打开 `_parent` 父级frame `_top` 顶