antd中getFieldDecorator的应用

antd的Form中弃用了getFieldProps,改为了getFieldDecorator,现在记录一下相关的用法。
getFieldDecorator用于数据的交互反馈

之前对于getFieldProps,首先定义是const {getFieldProps} = this.props.form;
现在对于getFieldDecorator,没有变化const {getFieldProps} = this.props.form;
对于表单元素FormItem中的调用变化较大:
之前:

<FormItem label="密码">
	<Input type="password" placeholder="请输入您的密码" {...getFieldProps('r_password')}/>
</FormItem>

现在:

<FormItem label="确认密码">
  {getFieldDecorator('r_confirmPassword')(<Input type="password" placeholder="请再次输入您的密码" />)}
</FormItem>

this.props.form.getFieldDecorator(id, options)

经过 getFieldDecorator 包装的控件,表单控件会自动添加 value(或 valuePropName 指定的其他属性) onChange(或 trigger 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:

  1. 你不再需要也不应该用 onChange 来做同步,但还是可以继续监听 onChange 等事件。
  2. 你不能用控件的 value defaultValue 等属性来设置表单域的值,默认值可以用 getFieldDecorator 里的 initialValue。你不能用控件的 value defaultValue 等属性来设置表单域的值,默认值可以用 getFieldDecorator 里的 initialValue.
  3. 你不应该用 setState,可以使用 this.props.form.setFieldsValue 来动态改变表单值。你不应该用 setState,可以使用 this.props.form.setFieldsValue 来动态改变表单值。
getFieldDecorator(id, options) 参数

id是必填参数,表示输入控件唯一标志 string

参数说明类型默认值
id必填,输入控件唯一标志string
options选填,表以对象字面量的形式表示相应的选项

对于options ,有以下属性:

属性说明类型默认值
getValueFromEvent指定如何从事件中获取值,可以把 onChange 的参数(如 event)转化为控件的值function(…args)
initialValue子节点的初始值,类型、可选值均由子节点决定(注意:由于内部校验时使用 === 判断是否变化,建议使用变量缓存所需设置的值而非直接使用字面量))
normalize转换默认的 value 给控件function(value, prevValue, allValues): any
rules校验规则,见下方表格object[]
trigger收集子节点的值的时机string‘onChange’
validateFirst当某一规则校验不通过时,是否停止剩下的规则的校验boolean
validateTrigger校验子节点值的时机stringstring[]
valuePropName子节点的值的属性,如 Switch 的是 ‘checked’string‘value’

上文说的校验规则:

参数说明类型默认值
enum枚举类型string-
len字段长度number-
max最大长度number-
message校验文案stringReactNode
min最小长度number-
pattern正则表达式校验RegExp-
required是否必选booleanfalse
transform校验前转换字段值function(value) => transformedValue:any-
type内建校验类型,可选项string‘string’
validator自定义校验(注意,callback 必须被调用)function(rule, value, callback)-
whitespace必选时,空格是否会被视为错误booleanfalse

样例分析

{getFieldDecorator('upload', {
  valuePropName: 'fileList',
  getValueFromEvent: this.normFile,
  })(
    <Upload name="logo" action="/upload.do" listType="picture">
      <Button><Icon type="upload" /> Click to upload</Button>
    </Upload>
)}
  • 'upload’表示该控件的标志,自己定义就成。
  • valuePropName:表示子节点的属性。说白了就是<input type="file">元素都有一个files属性(property),用来存储用户所选择的文件,fileList就表示可以通过这个对象访问到用户所选择的文件。
  • getValueFromEvent:表示通过this.normFile来获取这个事件的值
{getFieldDecorator('select-multiple', {
  rules: [
    { required: true, 
      message: 'Please select your favourite colors!', 
      type: 'array' 
      },
    ],
  })(
    <Select mode="multiple" placeholder="Please select favourite colors">
      <Option value="red">Red</Option>
      <Option value="green">Green</Option>
      <Option value="blue">Blue</Option>
    </Select>
)}
  • "select-multiple"表示该控件的标志
  • "rules"校验规则。此处的校验规则有required、message和type
    • required:表示是否必选,用在此处表示下面的表单是否必填。
    • message:表示校验文案 ,即当不满足时会弹出的提示文字。用在此处表示当不满足required的要求时,即此处表单没有填的时候,会弹出提示文字:Please select your favourite colors!
    • type:内建校验类型。此处是array,表示应当是一个数组类型
getFieldDecorator(id, options) 之后是什么

可以看到getFieldDecorator(id, options) 之后还有一个(),此处()里面的内容表示要应用getFieldDecorator的元素。
之前的getFieldProps是如下写法:

<FormItem label="密码">
	<Input type="password" placeholder="请输入您的密码" {...getFieldProps('r_password')}/>
</FormItem>

即将其作为<Input>的一个属性。
而现在的getFieldDecorator可以说是作为了一个函数使用:

<FormItem label="确认密码">
  {getFieldDecorator('r_confirmPassword')(<Input type="password" placeholder="请再次输入您的密码" />)}
</FormItem>

后面的(<Input type="password" placeholder="请再次输入您的密码" />)就表示要将getFieldDecorator应用的元素位置。

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值