Formik onSubmit函数不适用于我的代码

时间:2019-03-19 09:25:14

标签: reactjs typescript formik

我正在使用react和formik创建一个表单。下面是我的代码:

<div>
  <Formik
    initialValues={{
      email: ""
    }}
    onSubmit={(values: FState, setSubmitting: any) => {
      console.log("Enter in submit function", values);
      setTimeout(() => {
        alert(JSON.stringify(values, null, 2));
        setSubmitting(false);
      }, 500);
    }}
    validationSchema={validationSchemaGlobal}
  >
    {({
      errors,
      touched,
      handleBlur,
      handleChange,
      isSubmitting,
      values,
      handleSubmit
    }: any) => (
      <div>
        <Cards>
          <form onSubmit={handleSubmit}>
            <CardBody>
              <h4>
                Enter Your Email Address and we'll send you a link to reset your
                password
              </h4>
              <Field
                type="text"
                id="email"
                value={values.email}
                component={CustomInput}
                onChange={handleChange}
                onBlur={handleBlur}
              />
              {errors.email && touched.email ? (
                <div style={{ color: "red" }}>{errors.email}</div>
              ) : null}
            </CardBody>
            <CardFooter>
              <br />
              <button type="submit" disabled={isSubmitting}>
                Send Password Reset Link
                {/* {isSubmitting && <i className="fa fa-sponner fa-spin"/>} */}
              </button>
            </CardFooter>
          </form>
        </Cards>
      </div>
    )}
  </Formik>
</div>

在这种形式的表单中,onSubmit函数不起作用。我不知道为什么?请告诉我我的代码有什么问题?

6 个答案:

答案 0 :(得分:12)

检查您的validationSchema。我遇到了这个问题,发现我的验证器正在向Formik发送信号,表明该表单无效,但是没有其他警告或消息出现。它只是不会提交。

validator={() => ({})}替换道具,即只返回一个空对象。那应该通过验证并触发您的onSubmit。您可以从那里恢复功能。

  <Formik
    initialValues={{
      email: ""
    }}
    onSubmit={() => { console.log("submit!"); }}
    validator={() => ({})}
  >
    {/* */}
  </Formik>

答案 1 :(得分:8)

在我的情况下,我使用Yup作为验证器,并且在我的firstName中意外地有lastNamevalidationSchema,但是我的表单中没有这些值。

我的validationSchema

const SignupSchema = Yup.object().shape({
  firstName: Yup.string()
    .min(2, 'Too Short!')
    .max(50, 'Too Long!')
    .required('Required'),
  lastName: Yup.string()
    .min(2, 'Too Short!')
    .max(50, 'Too Long!')
    .required('Required'),
  email: Yup.string()
    .email('Invalid email')
    .required('Required'),
  password: Yup.string()
    .min(6, 'Password must be at least 6 characters')
    .max(24, 'Password can be maximum 24 characters')
    .required('Required')
}) 

我刚刚删除了firstNamelastName

const SignupSchema = Yup.object().shape({
  email: Yup.string()
    .email('Invalid email')
    .required('Required'),
  password: Yup.string()
    .min(6, 'Password must be at least 6 characters')
    .max(24, 'Password can be maximum 24 characters')
    .required('Required')
})

因此,请检查您的validationSchema,看看您是否需要表格中不存在的内容。

答案 2 :(得分:1)

就我而言,onSubmit 不起作用,因为我忘记将表单包装在 <form></form> 标记中。一个愚蠢的问题,但它可能是这种行为的原因。如果上述解决方案不起作用,请检查您是否拥有 form 标签。

答案 3 :(得分:1)

最初的问题有点晚了,但我遇到了同样的问题并且解决了它很容易但很难找到。

当我将“name”属性传递给组件时,我写的是“DateOfBirth”而不是小写,这意味着它与我的验证架构不匹配。

我的架构如下所示:

export const userSchema = yup.object().shape({
firstName: yup.string().min(1).max(50).required('Field is required'), 
lastName: yup.string().min(1).max(50).required('Field is required'), 
dateOfBirth: yup.date().required('Invalid input'),});

这意味着组件的名称必须匹配

之前(无效):

 <DateTimePicker name="DateOfBirth" label="Date of birth" />

之后(工作):

<DateTimePicker name="dateOfBirth" label="Date of birth" />

答案 4 :(得分:1)

我从 Form 而不是 react-bootstrap 导入了 formik,所以我遇到了同样的问题。该问题已通过导入 Formformik 解决。

答案 5 :(得分:-1)

在我为我工作时使用而不是按钮标签。