【问题标题】:Why is validation not being run onSubmit in Redux-form?为什么验证没有在 Redux-form 中运行 onSubmit?
【发布时间】:2017-06-30 22:45:23
【问题描述】:

我在下面有以下 react redux-form 为用户提供输入一封或多封电子邮件的表单。

由于某种原因,验证未在提交时运行。我添加了一个控制台日志,仅在页面加载时才看到正在运行的验证功能。

我做错了什么导致验证不运行 onSubmit?

import React from 'react';
import {Field, FieldArray, reduxForm} from 'redux-form'

let renderEmailField = ({input, label, type, meta: {touched, error}}) =>
  <fieldset>
    <label>{label}</label>
    <div>
      <input {...input} name="email" type="text" className="form-control" />
      {touched && error && <span>{error}</span>}
    </div>
  </fieldset>

let renderEmails = ({fields, meta: {submitFailed, error}}) =>
    <div>

    {fields.map((email, index) =>
      <div className="row form-group" key={index}>

        <div className="col-6">
          <Field
            name={email}
            component={renderEmailField}
            label={`Email Address`}
          />
        </div>
        <div className="col">
          {index > 2 &&
            <a href onClick={(e) => {e.preventDefault(); fields.remove(index)}}>X</a>
          }
        </div>
        <div className="col">
          {submitFailed && error &&
            <span className="error">{error}</span>
          }
        </div>

      </div>
      )}

      <div className="row form-group">
        <div className="col">
          <p>
            <a href onClick={(e) => {e.preventDefault(); fields.push()}}>Add Email</a>
          </p>
        </div>
      </div>

    </div>

class RaterInviteForm extends React.Component {

  handleSubmit(data) {
    // stuff
  }

  render() {

    const { submitting } = this.props
    return (
      <div className="RaterInviteForm">
        <h1>Invites</h1>
        <form className="form" onSubmit={this.props.handleSubmit(this.handleSubmit.bind(this))}>
          <FieldArray name="emails" component={renderEmails} />
          <div className="form-group">
            <button type="submit" disabled={submitting} className="btn btn-primary">Send Invitations</button>
          </div>
        </form>
      </div>
    );
  }

}

const validate = values => {
  const errors = {}
  console.log('validate')
  if (!values.emails || !values.emails.length) {
    errors.emails = {_error: 'At least one email must be entered'}
  }
  else {
    let emailsArrayErrors = []
    if (emailsArrayErrors.length) {
      errors.emails = emailsArrayErrors
    }
  }
  return errors
}

RaterInviteForm = reduxForm({
  form: 'emailsForm',
  initialValues: {
    emails: ['', '', '']
  },
  validate
})(RaterInviteForm)
...

【问题讨论】:

  • 作为文档状态 (redux-form.com/6.8.0/examples/submitValidation),您可以尝试将您的 submit 函数传递给 this.props.handleSubmit() 吗?如onSubmit={this.props.handleSubmit(submit)。您还将从 reduxForm({}) 中删除 validate
  • 那么你如何解决这个问题?谢谢。
  • 如果您使用的是最新版本,我会尝试文档显示的实现提交验证的正确方法。
  • @BrettDeWoody 你能说得更具体一点吗?谢谢

标签: reactjs react-redux redux-form react-redux-form


【解决方案1】:

Redux Form docs/example 表明它应该像下面的例子那样完成。

您应该将submit 验证函数传递给this.props.handleSubmit(),如onSubmit={this.props.handleSubmit(validate)}

class RaterInviteForm extends React.Component {

  render() {

    const { submitting } = this.props
    return (
      <div className="RaterInviteForm">
        <h1>Invites</h1>
        <form className="form" onSubmit=    {this.props.handleSubmit(validate)}>
          <FieldArray name="emails" component={renderEmails} />
          <div className="form-group">
            <button type="submit" disabled={submitting} className="btn btn-primary">Send Invitations</button>
          </div>
        </form>
      </div>
    );
  }

}

const validate = values => {
  const errors = {}
  console.log('validate')
  if (!values.emails || !values.emails.length) {
    errors.emails = {_error: 'At least one email must be entered'}
  }
  else {
    let emailsArrayErrors = []
    if (emailsArrayErrors.length) {
      errors.emails = emailsArrayErrors
    }
  }
  return errors
}

RaterInviteForm = reduxForm({
  form: 'emailsForm',
  initialValues: {
    emails: ['', '', '']
  }
})(RaterInviteForm)
...

【讨论】:

【解决方案2】:

默认情况下,验证在模糊事件上运行。

此外,默认情况下 submitFailed (redux form props) 设置为 False 。这个道具只有在验证通过后才会生效,然后你就可以提交表单了。

因此,您可以使用期望函数作为参数的 onHandleSubmit。 示例

onSubmit={handleSubmit(validate)}

或者你可以添加这个

RaterInviteForm = reduxForm({
  form: 'emailsForm',
touchOnBlur : false 
  initialValues: {
    emails: ['', '', '']
  },
  validate
})(RaterInviteForm)

它的作用是,它仅在您提交表单时验证表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多