虽然 react 没有内置的表单验证逻辑,可是咱们可使用 react 组件库 AntDesign 中的表单组件 Form
来实现这一需求。前端
具体地, AntDesign 中的表单组件 Form
与表单域 Form.Item
(用于包裹任意输入控制的容器)配合使用:react
Form.Item
中设置校验规则,在表单提交或表单输入变化时,经过执行 this.props.form.validateFields()
来实现表单值的校验。Form.Item
中放置一个被 getFieldDecorator
注册的表单控件(子元素)来实现表单控件与表单的双向绑定,实现表单值的收集。使用 Form
自带的自动收集数据和校验功能的关键是须要使用 Form.create()
包装组件(传送门👉AntDesign 官方文档)。函数
Form.create()
是一个高阶函数,经过传入一个 react 组件,返回一个新的具备注册、收集、校验功能的 react 组件。使用方式以下:post
class CustomizedForm extends React.Component {} CustomizedForm = Form.create({})(CustomizedForm); export default CustomizedForm; 复制代码
Form.create()
包装过的组件会自带 this.props.form
属性,该属性提供了许多 API 来处理数据,如上面介绍的 getFieldDecorator
方法 则是用于和表单进行双向绑定。组件一旦通过 getFieldDecorator
的修饰,那么该组件的值将彻底由 Form
接管。Form.create()
包装组件的目的就是为了使用第一种方式更新被包装组件:
getFieldDecorator
修饰过的组件触发onChange事件
,便会触发这个父组件的的更新(forceUpdate),从而促使被包装组件的更新。Form.create({})(CustomizedForm)
, CustomizedForm
就是咱们所说的被包装组件。this.props.form
属性提供的几种 API 和使用方法,其余 API 可具体查看文档(传送门👉AntDesign 官方文档)。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> 复制代码
getFieldValue
方法的做用是获取一个输入控件的值。使用方法以下:let options = this.props.form.getFieldValue('name'); // 使用getFieldDecorator方法修饰的id为'name'的表单控件 复制代码
setFieldsValue
方法用于动态设置一组输入控件的值(⚠️注意:不要在 componentWillReceiveProps
内使用,不然会致使死循环)。使用方法以下:// 设置使用getFieldDecorator方法修饰的id为'name'的表单控件的值 this.props.form.setFieldsValue({ name: undefined }); 复制代码
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 }); } }); } 复制代码
getFieldDecorator(id, options)
方法中传入的校验规则参数 options.rules
来实现,下面就为你们整理了一下 AntDesign 中经常使用的几种表单输入格式验证。{getFieldDecorator('name', { rules: [{ required: true, message: '名称不能为空', }], })(<Input placeholder="请输入名称" />)} 复制代码
{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="请输入昵称" />)} 复制代码
{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(); } 复制代码
{getFieldDecorator('nickname', { rules: [{ whitespace: true, message: '不能输入空格', } ], })(<Input placeholder="请输入昵称" />)} 复制代码
{getFieldDecorator('age', { rules: [{ message:'只能输入数字', pattern: /^[0-9]+$/ }], })(<Input placeholder="请输入数字" />)} 复制代码