文章目录

  • 一、基本介绍
  • 二、this.props.form 属性提供的 API
    • 1、getFieldDecorator
    • 2、getFieldValue
    • 3、setFieldsValue
    • 4、validateFields
  • 三、格式限制验证
    • 1、输入框不能为空限制
    • 2、输入框字符限制
    • 3、自定义校验
    • 4、whitespace空格报错
    • 5、pattern正则验证
  • 四、表单的回显设置
    • 1、普通input输入框

一、基本介绍

  • 虽然 react 没有内置的表单验证逻辑,但是我们可以使用 react 组件库 AntDesign 中的表单组件 Form 来实现这一需求。

  • 具体地, AntDesign 中的表单组件 Form 与表单域 Form.Item(用于包裹任意输入控制的容器)配合使用:

    • 在 Form.Item 中设置校验规则,在表单提交或表单输入变化时,通过执行 this.props.form.validateFields() 来实现表单值的校验。
    • 在 Form.Item 中放置一个被 getFieldDecorator 注册的表单控件(子元素)来实现表单控件与表单的双向绑定,实现表单值的收集。
  • 使用 Form 自带的自动收集数据和校验功能的关键是需要使用 Form.create() 包装组件。

  • Form.create() 是一个高阶函数,通过传入一个 react 组件,返回一个新的具有注册、收集、校验功能的 react 组件。使用方式如下:

class CustomizedForm extends React.Component {}
CustomizedForm = Form.create({})(CustomizedForm);
export default CustomizedForm;
  • 经 Form.create() 包装过的组件会自带 this.props.form 属性,该属性提供了许多 API 来处理数据,如上面介绍的 getFieldDecorator 方法 则是用于和表单进行双向绑定。组件一旦经过 getFieldDecorator 的修饰,那么该组件的值将完全由 Form 接管。
  • 我们知道,组件的更新有两种方式:1. 父组件更新;2. 自身状态发生改变。
  • 使用 Form.create() 包装组件的目的就是为了使用第一种方式更新被包装组件:
    • 一旦被 getFieldDecorator 修饰过的组件触发onChange事件,便会触发这个父组件的的更新(forceUpdate),从而促使被包装组件的更新。
    • 上面提到的 Form.create({})(CustomizedForm), CustomizedForm就是我们所说的被包装组件。
  • 下面将介绍 this.props.form 属性提供的几种 API 和使用方法,其他 API 可具体查看文档。

二、this.props.form 属性提供的 API

1、getFieldDecorator

getFieldDecorator 方法的目的是为了把需要收集的数据在实例中进行注册,并把注册的值同步到被 getFieldDecorator 修饰的表单控件上,所以该控件不能再通过 value 或 defaultValue 赋值,它的状态将全部由 getFieldDecorator 托管,默认值设置可以用 getFieldDecorator 里的 initialValue。 使用方式如下:

// 语法:getFieldDecorator(id, options)
<Form.Item {...layout} label="题目" extra={titleExtra}>{getFieldDecorator('name', {rules: [{ required: true, message: '记得填写题目' },{ whitespace: true, message: '记得填写题目' },],initialValue: name, // 默认值设置})(<Input allowClear={true}/>)}
</Form.Item>

2、getFieldValue

getFieldValue 方法的作用是获取一个输入控件的值。使用方法如下:

let options = this.props.form.getFieldValue('name'); // 使用getFieldDecorator方法修饰的id为'name'的表单控件

3、setFieldsValue

setFieldsValue方法用于动态设置一组输入控件的值(⚠️注意:不要在 componentWillReceiveProps 内使用,否则会导致死循环)。使用方法如下:

 // 设置使用getFieldDecorator方法修饰的id为'name'的表单控件的值
this.props.form.setFieldsValue({ name: undefined });

4、validateFields

validateFields方法用于校验并获取一组输入域的值与错误,使用方法如下(若 fieldNames 参数为空,则校验全部组件):

/*类型:([fieldNames: string[]],[options: object],callback(errors, values)) => void
*/
const { form: { validateFields } } = this.props;validateFields((errors, values) => {// ...
});validateFields(['field1', 'field2'], (errors, values) => {// ...
});validateFields(['field1', 'field2'], options, (errors, values) => {// ...
});// 通过 validateFields 方法验证表单是否完成填写,通过便提交添加操作。
handleOk = () => {const { dispatch, form: { validateFields } } = this.props;validateFields((err, values) => {if (!err) {dispatch({type: 'cards/addOne',payload: values,});// 重置 `visible` 属性为 false 以关闭对话框this.setState({ visible: false });}});
}

三、格式限制验证

  • AntDesign 中表单的功能很多,其中,表单输入格式验证是通过设置 getFieldDecorator(id, options) 方法中传入的校验规则参数 options.rules 来实现,下面就为大家整理了一下 AntDesign 中常用的几种表单输入格式验证。

1、输入框不能为空限制

实例代码:

{getFieldDecorator('name', {rules: [{required: true,message: '名称不能为空',}],
})(<Input placeholder="请输入名称" />)}

2、输入框字符限制

字符长度范围限制:

{getFieldDecorator('password', {rules: [{required: true,message: '密码不能为空',}, {min:4,message: '密码不能少于4个字符',}, {max:6,message: '密码不能大于6个字符',}],
})(<Input placeholder="请输入密码" type="password"/>)}

字符长度限制:

{getFieldDecorator('nickname', {rules: [{required: true,message: '昵称不能为空',}, {len: 4,message: '长度需4个字符',}],
})(<Input placeholder="请输入昵称" />)}

3、自定义校验

validator属性自定义效验,必须返回一个callback:

{getFieldDecorator('passwordcomfire', {rules: [{required: true,message: '请再次输入密码',}, {validator: passwordValidator}],
})(<Input placeholder="请输入密码" type="password"/>)}//  密码验证
const passwordValidator = (rule, value, callback) => {const { getFieldValue } = form;if (value && value !== getFieldValue('password')) {callback('两次输入不一致!')}// 必须总是返回一个 callback,否则 validateFields 无法响应callback();
}

4、whitespace空格报错

若输入只有一个空格,则会报错:

{getFieldDecorator('nickname', {rules: [{whitespace: true,message: '不能输入空格',} ],
})(<Input placeholder="请输入昵称" />)}

5、pattern正则验证

如果输入的不是数字,则提示错误:

{getFieldDecorator('age', {rules: [{message:'只能输入数字',pattern: /^[0-9]+$/}],
})(<Input placeholder="请输入数字" />)}

四、表单的回显设置

1、普通input输入框

在进入页面时判断是否需要回显,之后利用setFieldsValue({key:value})的方式设置回显

componentDidMount() {const goodsId = window.localStorage.getItem('goodsId')if (goodsId) {axios.get('http://localhost:8888/goods/item', {params: {id: goodsId}}).then(res => {console.log(res.data.info);this.formRef.current.setFieldsValue({goodsName: res.data.info.title,goodsClassify: res.data.info.category,goodsPrice: res.data.info.price,// goodsPic:res.data.info.img_big_logo,})}, err => {})}}

Ant Design表单的使用相关推荐

  1. ant Design 表单以及表单验证

    今天用ant Design写了个修改密码的功能,随便记录一下 效果图 html代码 <div><a-modal v-model="visible" title=& ...

  2. ant Design表单验证笔记

    1.pattern正则验证 <Col md={12} sm={24}><FormItem {...formItemLayout} label="班数">{f ...

  3. Ant design-05 表单多选的组件

    本节:多选功能的表单 table主要加的内容: 1.<a-table    :row-selection="{ selectedRowKeys: selectedRowKeys, on ...

  4. jeecg-boot ant组件表单的值的操作

    jeecg-boot中ant表单的常用操作 jeecg-boot生成的页面使用v-decorator绑定数据,无法直接操作数据,可以用下面的方法来操作. 获取一个表单中的某值 this.form.ge ...

  5. Ant Design 表单手机号验证

    rules :[{pattern: /^1[3|4|5|7|8][0-9]\d{8}$/,message: '请输入正确的手机号'} ] 或者 rules :[{pattern: /^1(3[0-9] ...

  6. B端页面——详细表单设计流程

    一.什么是表单? 表单设计是B端产品设计的基础页面,想要做好表单设计首先要搞清楚表单的应用场景. 表单是用户采集数据信息的核心场景,同时又通过表单向用户展示数据信息,简而言之表单是用户与数据库之间的桥 ...

  7. B端——复杂业务表单设计

    作者:nick (转载已取得作者授权) 一.前言 表单是B端产品中最常用的信息录入工具,但由于B端产品业务的复杂性,表单往往呈现出字段多.类型杂等特点,增大了它的设计难度:一个糟糕的表单,会极大影响用 ...

  8. 实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

  9. android 自定义表单,Android实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

最新文章

  1. ATS中的RAM缓存简介
  2. 又一位!26岁当上985博导,读博期间也曾两次想要退学......
  3. phpcmsv9多表联合查询分页功能实现
  4. 疯狂C#~伴随着我的库存管理¥
  5. C++longest increasing subsequence 最长递增子序列的实现之二(附完整源码)
  6. 2021牛客多校5 - Double Strings(dp+组合数学)
  7. RepPoints(本质是可变形卷积DCN)再理解
  8. Linux常用命令—权限管理命令—权限管理命令chmod
  9. udf提权 udf.php,UDF提权
  10. SAP License:SAP 清帐函数示例
  11. 在线JSON美化格式化工具
  12. JAVA调用NuSoap服务
  13. 京东大数据技术白皮书
  14. python pygame实战1: 小球碰撞balls collision
  15. matlab m文件开方,请问,在matlab里面如果输入开方号(根号)?如9的开方怎么写?
  16. UI设计中的排版设计技巧
  17. php地图找房代码,地图搜租房功能实现
  18. sklearn入门——聚类算法KMeans
  19. STM32 的核心Cortex-M3 处理器
  20. 微信公众号推荐(自己关注的微信公众平台导航)

热门文章

  1. java的double类型比较相等
  2. C 语言管理个人财务系统
  3. RUL论文复现:深度卷积神经网络在预测剩余寿命估计中的应用
  4. 数据库系统、数据库、数据库管理系统简介,MySQL等服务器的比较
  5. 柔性制造系统(FMS)实训QY-JDYT09
  6. C# 利用PrintDocument定制打印单据
  7. Android中Shared Preferences、Files、Network、SQLite数据库编程总结及示例
  8. XML encoding 与 文件编码
  9. Android 阿里云推送,针对安卓8.0、9.0以上系统收不到推送 的补丁文档
  10. 企业AAA信用等级办理好处,认证流程