form.validateFields() 在 ant 设计表单中的 onValuesChange 内失败

Posted

技术标签:

【中文标题】form.validateFields() 在 ant 设计表单中的 onValuesChange 内失败【英文标题】:form.validateFields() fails inside onValuesChange in ant design forms 【发布时间】:2020-10-25 03:36:05 【问题描述】:

我正在尝试通过验证以编程方式提交和 ant design (v4.3.4) 表单,但如果 form.validateFields()onValuesChange() 内部,outOfDate: true 总是失败。 (这个表单是一个更大的表单工厂的一部分,所以我最终必须将表单组件传递给一个 props 函数,然后该函数将调用提交。

const FormA = (props: StepProps) => 
  const [form] = useForm();

  return (
    <Form
      form=form
      name="form-a"
      onValuesChange=async (changedValues, allValues) => 
        form.validateFields().
         then(values => console.log("PASSED").
         catch(errorInfo => console.log("FAILED", errorInfo));
      
    >
      <Form.Item 
      rules=[ required: true ] 
      name="item-a">
        <Input />
      </Form.Item>
      <Form.Item
        rules=[ required: true ]
        name="item-b"
      >
        <Input />
      </Form.Item>
      <Form.Item
        rules=[ required: true ]
        name="item-c"
      >
        <Input />
      </Form.Item>
    </Form>
  );
;

export default FormA;

我已经调用了form.validatedField() 函数 onValuesChange。我从来没有在控制台中得到“PASSED”,即使所有输入都有值,我总是得到“FAILED”并显示以下错误信息:


  errorFields: []
  outOfDate: true
  values:  ..

如果我从onValuesChange 中删除 form.validateFields(),那么它工作正常。

我似乎无法弄清楚outOfDate 是什么以及为什么在 onValuesChange 函数中验证总是失败。

【问题讨论】:

我遇到了几乎相同的问题,也许我在antd 的 GitHub 上的问题会帮助您了解问题github.com/ant-design/ant-design/issues/26747 【参考方案1】:

以编程方式提交表单的最佳方式是使用form.submit(),它是form instance 的一部分。此功能将提交并验证您的表单。根据验证结果,将调用onFinishonFinishFailed(参见Form API)。

const FormA = (props: StepProps) => 
  const [form] = useForm();

  const handleOnFinish = (values) => 
    // handle valid form submission
  

  const handleOnFinishFailed = ( values, errorFields, outOfDate ) => 
    // handle invalid form submission
  

  return (
    <Form
      form=form
      name="form-a"
      onFinish=handleOnFinish]
      onFinishFailed=handleOnFinishFailed
    >
      ...
    </Form>
  );
;

export default FormA;

使用此方法解决了outOfDate 问题。如果您需要对表单项进行额外的验证处理,可以在组件中使用onChangeform.validateFields()(请参阅issue)。

【讨论】:

以上是关于form.validateFields() 在 ant 设计表单中的 onValuesChange 内失败的主要内容,如果未能解决你的问题,请参考以下文章

ant-design form

关于ant-design Form表单使用的小技巧

关于ant-design Form表单使用的小技巧

5-3 使用antDesign的form组件

Ant Design表单Form常用方法

ant design的form组件使用总结