form.create.jpg

image.png
通过 getFieldDecorator绑定的组件,不能传递的属性有

  1. id,会覆盖默认的 id:13, 传递的 id为 dataSource[0].key 是当前的 id
  2. value,initialValue代替
    1. <Item label="Key">
    2. {getFieldDecorator(`${KEY}.key`, {
    3. // initialValue: _value.key,
    4. })(<KeysSelect currentKey={_value.key} id={13}/>)}
    5. </Item>

Form.create用法

  1. function BaseForm({form}) {
  2. function onSubmit(e) {
  3. e.preventDefault()
  4. form.validateFields((err, values) => {
  5. console.log('form', err)
  6. })
  7. }
  8. return (
  9. <Form onSubmit={onSubmit}>
  10. <Button htmlType='submit'>提交</Button>
  11. </Form>
  12. )
  13. }
  14. export default Form.create()(BaseForm)
  15. export default memo(Form.create()(BaseForm))
  16. // onChange获取数据
  17. export default Form.create({
  18. onValuesChange(props, changedValues) {
  19. setTimeout(() => {
  20. const values = props.form.getFieldsValue()
  21. props.onChange(values, changedValues)
  22. }, 0)
  23. }
  24. })(BaseForm)

form

form.create.jpg
form是个黑盒子,外部数据改变不会影响到 form
获取form的值,必须通过 form.getFieldsValue() 来获取
form.jpg

initialValue

  1. 使用 getFieldDecorator并用 initialValue设定初始值时,当改变组件的值时,组件表现出的值也改变了
  2. 但这个值并不是initialValue设定的,其是组件内部的state值保持的,
  3. 如果需要继续用 initialValue来设定组件的值,需要调用 resetFields方法使 initialValue有效

设置 value值报错

  1. Warning: getFieldDecorator will override value, so please don’t set value directly and use setFieldsValue to set it.
  2. 用 Form.create()() HOC,可以从 props中获取到 form.getFieldDecorator
  3. 不能使用 value,要用 initialValue

form.getFieldsValue

form.setFieldsValue

  1. form.setFieldsValue传来的数据这个方法只能适用于field存在的前提下,即数据和field是一对一的关系
  2. 多传了一个参数!!所以导致了报警告
  3. updateList的数据出了问题才会报警告,因为封装的form中的field中没有 ids这个参数
    1. form.setFieldsValue不要多传值

  4. componentWillReceiveProps的替代升级方案 getDerivedStateFromProps
  5. antd的form组件setFieldsValue在ComponentWillreceiveProps中会死循环的解决方案
    1. 先判断值是否变化,不重复执行应该就不会死循环了
  1. // form.setFieldsValue 有死循环的问题
  2. componentDidMount(){
  3. const { form,updateList, productList } = this.props
  4. // 给form赋值
  5. form.setFieldsValue({
  6. 'service_name': updateList.service_name,
  7. 'fileType': updateList.fileType,
  8. 'press': updateList.press,
  9. 'remark': updateList.remark,
  10. })
  11. }

@Form.create装饰器

装饰器语法 https://segmentfault.com/p/1210000009968000/read
装饰器语法只能用在 class组件,Hooks函数组件无法使用装饰器

  1. import React, { PureComponent } from 'react';
  2. import { Form, Input } from 'antd';
  3. import styled from './style.modules.less';
  4. @Form.create() // 装饰器语法
  5. class App extends PureComponent {
  6. renderItem = ({ item, index }) => {
  7. return (
  8. <Form.Item label="名称">
  9. {getFieldDecorator(`list.${index}.name`)(
  10. <Input />
  11. )}
  12. </Form.Item>
  13. );
  14. };
  15. render() {
  16. const { data } = this.props;
  17. return (
  18. <Form className={styled.form}>
  19. {data.map((item, index) => this.renderItem({ item, index }))}
  20. </Form>
  21. );
  22. }
  23. }
  24. export default App;