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

Rac*_*gon 8 reactjs antd ant-design-pro

我试图以编程方式提交和蚂蚁设计(v4.3.4)形式验证,但form.validateFields()总是失败,outOfDate: true如果它里面onValuesChange()。(这个表单是一个更大的表单工厂的一部分,所以我最终必须将表单组件传递给一个 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;
Run Code Online (Sandbox Code Playgroud)

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

{
  errorFields: []
  outOfDate: true
  values: { ..}
}
Run Code Online (Sandbox Code Playgroud)

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

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

The*_*ian 4

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

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;
Run Code Online (Sandbox Code Playgroud)

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