对于 antd 修改范围最大的就是 form 组件了, 从校验,写法 等各个方面,最初升级 v4 还是好久的事了, 记录了一下,找不到那个文档了

  • getFieldDecorator(弃用): 替换为 Form.Item 添加name 注册和获取表单值(前提是在最外层的 Form上添加 form)
  • 不再提供实时表单数据回填默认值, 在最初更新版本时官方给出的答案是破坏了默认值的机制
  • 必需是 Form.Item 直接包裹内置组件或者自定义组件(支持 value 和 onChange回调)才会触发 form机制,否则仅仅是一个样式布局而已
  • 触发 onFieldsChange 和 onValuesChange 的参数变化

    • v3为 props, changedFields 和 allFields 且都为对象
    • v4 changedFields和allFields 都为数组

      定义 form

      v3

      1. // 通过 Form.create()(Demo) 方式将 form 注入到组件内部
      2. const Demo = ({ form }) => {
      3. return <Form></Form>
      4. }

      v4

      1. // 通过转发 ref 获取到函数组件内部实例
      2. const Demo = React.forwardRef((props, ref) => {
      3. // 如果不手动定义并添加到 form 上, 可能并不会走 form 获取表单 & 校验机制
      4. const [form] = Form.useForm();
      5. return <Form ref={ref} form={form}></Form>
      6. });

      定义表单值

  • 删除了以前的 getFieldDecorator 定义表单组件

  • 重置表单值时机变化
  • 通过 getFieldValue 和 getFieldsValue 获取的值不再是实时表单数据 ```typescript // data为外部 props 传递表单初始值 const Demo = ({ form, data }) => { const { getFieldsValue, getFieldValue, getFieldDecorator } = form;

    // 这里的初始值 return (

    1. <Form>
    2. <Form.Item label="用户名">
    3. {getFieldDecorator('userName', {
    4. initialValue: data.userName
    5. })(
    6. <Input />
    7. )}
    8. </Form.Item>
    9. {/** 如果选择其他则展示输入框 */}
    10. <Form.Item label="性别">
    11. {getFieldDecorator('gender', {
    12. initialValue: data.
    13. })(
    14. <Select>
    15. <Option>男人</Option>
    16. <Option>女人</Option>
    17. <Option value="other">其他</Option>
    18. </Select>
    19. )}
    20. // 只有选择其他时才展示
    21. {getFieldValue('gender') === 'other' && (
    22. <Fragment>
    23. {getFieldDecorator('value')(
    24. <Input />
    25. )}
    26. <Fragment>
    27. )}
    28. </Form.Item>

    ) }

export default Form.create()(Demo);

<a name="SWNwI"></a>
#### v4

- [参考复杂表单](https://ant.design/components/form-cn/#components-form-demo-complex-form-control)
```typescript
const Demo = () => {
    const [form] = Form.useForm();
  // 需要手动在 useEffect 中执行重置
  useEffect(() => {
    form.resetFields();
  }, [])

  return (
      <Form form={form}>
        <Form.Item label="用户名" name="userName" initialValue="">
          <Input />  
      </Form.Item>
            <Form.Item label="性别" name="gender" initialValue="">
        <Select>
            <Option>呵男人</Option>
                    <Option>女人呵</Option>
                    <Option value="other">其他</Option>
                </Select>
      </Form.Item>
            // 参考: https://ant.design/components/form-cn/#dependencies
            // 有时稍微不对, 表单就不渲染
            <Form.Item noStyle dependencies={['gender']}>
        // 这里可以获取到实时表单数据
        {({ getFieldValue }) => {
            if (getFieldValue('gender') === 'other') {
              return (
                  <Form.Item noStyle name="value">
                    <Input />
                </Form.Item>
              )
          }

          return null;
        }} 
       <Form.Item>
      </Form.Item>
    </Form>
  )
}