【问题标题】:form.validateFields() fails inside onValuesChange in ant design formsform.validateFields() 在 ant 设计表单中的 onValuesChange 内失败
【发布时间】: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 函数中验证总是失败。

【问题讨论】:

标签: reactjs antd ant-design-pro


【解决方案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)。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2015-04-26
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多