react高阶组件rc-form


在移动端,针对form表单,经常会遇到要把输入框设置为受控组件,我们主要使用 rc-form 这个库,它是 react 高阶 form 组件。

rc-form 使用

import { createForm, formShape } from 'rc-form';

class Form extends React.Component {
  static propTypes = {
    form: formShape,
  };

  submit = () => {
    this.props.form.validateFields((error, value) => {
      console.log(error, value);
    });
  }

  render() {
    let errors;
    const { getFieldProps, getFieldError } = this.props.form;
    return (
      <div>
        <input {...getFieldProps('normal')}/>
        <input {...getFieldProps('required', {
          onChange(){}, // have to write original onChange here if you need
          rules: [{required: true}],
        })}/>
        {(errors = getFieldError('required')) ? errors.join(',') : null}
        <button onClick={this.submit}>submit</button>
      </div>
    );
  }
}

export createForm()(Form);

API

<form>
  <input {...getFieldProps('name', { ...options })} />
</form>

name: String
这个 input 唯一的 name
option: Object
| 选项 | 描述 | 类型 | 默认值 |
| —- | —- | —- | —- |
| option.valuePropName | 组件的值的字段的prop名称,例如:checkbox的设置是checked | String | ‘value’ |
| option.getValueProps | 通过字段值获取组件的props | (value): Object | (value) => ({ value }) |
| option.getValueFromEvent | 指定如何从事件中获取值。 | (e): any | See below |
| option.initialValue | 当前组件的初始值 | any | - |
| option.normalize | 返回正常的值. | (value, prev, all): Object | - |
| option.trigger | 监听表单数据事件. | String | ‘onChange’ |
| option.validateTrigger | 监听校验事件. 当只调用props.validateFields用于校验的时候设置. | String | String[] |
| option.rules | 校验规则 | Object[] | - |
| option.validateFirst | 是否停止对该字段的第一条错误规则进行校验 | boolean | false |
| option.validate | | Object[] | - |
| option.validate[n].trigger | 监听校验事件. 当只调用props.validateFields用于校验的时候设置. | String | String[] |
| option.validate[n].rules | 校验规则 | Object[] | - |
| option.hidden | 在验证或获取字段时忽略当前字段 | boolean | false |



getFieldsValue([fieldNames: String[]])
通过fieldNames获取字段值.

getFieldValue(fieldName: String)
通过fieldName获取字段值.

getFieldInstance(fieldName: String)
通过字段名称获取字段的公共实例。

setFieldsValue(obj: Object)
通过 kv object设置字段值.

setFieldsInitialValue(obj: Object)
通过KV对象设置字段初始值。用于重置和初始显示/值。

setFields(obj: Object)
用KV对象设置字段。每个字段的内容都可以包含错误信息和值。

validateFields([fieldNames: String[]], [options: Object], callback: (errors, values) => void)
通过fieldNames校验并获取字段值.

与async-validator的校验方法相同. 并且增加 force and scroll . scroll dom-scroll-into-view’s 函数参数 config 相同.

options.force: Boolean
默认为false. 是否校验已经校验过的字段(由ValueTebug触发)。

getFieldsError(names): Object{ [name]: String[] }
获取input的校验错误信息.

getFieldError(name): String[]
获取input的校验错误信息.

isFieldValidating(name: String): Bool
该input是否已校验。

isFieldsValidating(names: String[]): Bool
是否有一个input校验。

isFieldTouched(name: String): Bool
这个input的值是否已经被用户改变了。

isFieldsTouched(names: String[]): Bool
是否有一个input的值已经被用户改变了。

resetFields([names: String[]])
重置指定的输入。默认为所有。

isSubmitting(): Bool (Deprecated)
表单是否已提交.

submit(callback: Function) (Deprecated)
由于提交返回true,调用callback后,提交返回false。

基于ant-design-mobile 案例

import React from 'react'
import {connect} from 'dva'
import {TextareaItem, Toast, Checkbox, Modal, Radio, List,InputItem,DatePicker,Switch,Button} from 'antd-mobile'
import { createForm, formShape } from 'rc-form';

class Form extends React.Component {
  constructor(props) {
    super(props);
    this.state = {

    }
  }

  componentDidMount() {

  }


  submit = () => {
    this.props.form.validateFields((error, value) => {
      console.log(error, value);
    });
  }

  // 设置值
  setValue = ()=>{
    this.props.form.setFieldsValue({
      phone:'11111111111'
    })
  };

  // 重置
  resetFields = ()=>{
    this.props.form.resetFields()
  }

  render() {
    let errors;
    const { getFieldProps, getFieldError } = this.props.form;
    return (
      <form>
        <List renderHeader={() => 'rc-form'}>
          <InputItem
            {...getFieldProps('autofocus',{
              rules: [
                { required: true, message: '请输入' },
              ],
            })}
            clear
            placeholder="auto focus"
            ref={el => this.autoFocusInst = el}
          >标题</InputItem>
          <InputItem
            {...getFieldProps('phone',{
              rules: [
                { required: true, message: '请输入' },
              ],
            })}
            type="phone"
            placeholder="input your phone"
            error={getFieldError('phone')}
            onErrorClick={()=>{
              Toast.info((errors = getFieldError('phone')) ? errors.join(',') : null)
            }}
          >错误验证</InputItem>
          <DatePicker
            {...getFieldProps('dp', {
              initialValue: '',
              rules: [
                { required: true, message: 'Must select a date' },
              ],
            })}
          >
            <List.Item arrow="horizontal">Date</List.Item>
          </DatePicker>
          <List.Item
            extra={<Switch
              {...getFieldProps('Switch1', {
                initialValue: true,
                valuePropName: 'checked',
                onChange: (val) => {
                  console.log(val);
                  // Do not `setState` with rc-form
                  // this.setState({ checked1: val });
                },
              })}
              onClick={(checked) => {
                // set new value
                this.props.form.setFieldsValue({
                  Switch1: checked,
                });
              }}
            />}
          >On (with rc-form)</List.Item>
        </List>
         <Button type="ghost" inline size="small" style={{ marginRight: '4px' }} onClick={this.resetFields}>重置</Button>
        <Button type="ghost" inline size="small" style={{ marginRight: '4px' }} onClick={this.setValue}>设置值</Button>
        <Button type="ghost" inline size="small" style={{ marginRight: '4px' }} onClick={this.submit}>提交</Button>
      </form>
    );
  }
}

export default createForm()(Form);


文章作者: yinol
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yinol !
  目录