如何知道 Ant-Design 表单中的所有字段何时被验证(添加值)?

Posted

技术标签:

【中文标题】如何知道 Ant-Design 表单中的所有字段何时被验证(添加值)?【英文标题】:How to Know When All Fields are Validated (Values Added) in Ant-Design Form? 【发布时间】:2019-10-10 05:47:21 【问题描述】:

我有一个简单的Form,它检查用户的输入值,例如姓名、电子邮件和地址并验证它们。到目前为止,我已经成功实现了这一点。但是我有一个提交 button 作为最后一个 Form.Item,我只想在所有输入字段都填写并验证后才启用它。

我应该如何检查并随后设置状态formCompleted 来切换按钮的禁用?

【问题讨论】:

【参考方案1】:

检查这个例子https://ant.design/components/form/#components-form-demo-horizontal-login。

function hasErrors(fieldsError) 
  return Object.keys(fieldsError).some(field => fieldsError[field]);


class HorizontalLoginForm extends React.Component 
  componentDidMount() 
    // To disabled submit button at the beginning.
    this.props.form.validateFields();
  

handleSubmit = e => 
    e.preventDefault();
    this.props.form.validateFields((err, values) => 
      if (!err) 
        console.log('Received values of form: ', values);
      
    );
  ;

  render() 
    const  getFieldDecorator, getFieldsError, getFieldError, isFieldTouched  = this.props.form;

    // Only show error after a field is touched.
    const usernameError = isFieldTouched('username') && getFieldError('username');

    return (
      <Form layout="inline" onSubmit=this.handleSubmit>
        <Form.Item validateStatus=usernameError ? 'error' : '' help=usernameError || ''>
          getFieldDecorator('username', 
            rules: [ required: true, message: 'Please input your username!' ],
          )(
            <Input placeholder="Username" />,
          )
        </Form.Item>

        <Form.Item>
          <Button htmlType="submit" disabled=hasErrors(getFieldsError())>
            Log in
          </Button>
        </Form.Item>
      </Form>
    );
  

该示例检查getFieldsError 是否有任何值来确定是否应禁用按钮。当表单首次挂载时,它使用validateFields 来验证您的输入并更新getFieldsError。这样做的问题是错误会在任何输入发生之前显示,这就是为什么它会在使用 isFieldTouched 显示错误之前检查字段是否已被触摸。

希望有帮助!

【讨论】:

哈...大声笑为什么我没有看到文档中的第一个示例!?傻我;p谢谢@John Wong,顺便说一句 它很好用,但是如果我还必须包含一个复选框作为表单项,并且当它被选中时才启用提交按钮,它就不起作用了。查看我的代码:const agreementError = isFieldTouched('ag') &amp;&amp; getFieldError('ag') &lt;Form.Item validateStatus=agreementError ? 'error' : '' help=agreementError || ''&gt; getFieldDecorator('ag', rules: [ required: true, message: 'Please check it!' ], valuePropName: 'checked', initialValue: false, )(&lt;Checkbox&gt;I've read the T&amp;C&lt;/Checkbox&gt;) &lt;/Form.Item&gt; 没关系。在将类型设置为布尔值并使用自定义验证器后使其工作 刚刚看到你的答案。不知道我们是否最终得到了相同的答案,但这是我找到的答案 github.com/ant-design/ant-design/issues/…。此外,您也可以在 Button disabled prop &lt;Button type="primary" htmlType="submit" disabled=hasErrors(getFieldsError()) || !getFieldValue("ag")&gt; 中检查您的复选框值 太棒了!谢谢约翰。感谢您的帮助!

以上是关于如何知道 Ant-Design 表单中的所有字段何时被验证(添加值)?的主要内容,如果未能解决你的问题,请参考以下文章

有人知道ant-design的表单验证getFieldDecorator怎么用嘛

如何只回复我们的网络表单

如何在表单中的所有字段聚焦时添加占位符?

如何使用 jQuery validate 验证表单中的所有字段?

将边框应用于表单中的所有字段和标签

ant-design表单校验defaultValue校验不通过问题