【问题标题】:Unable to set errors in Formik onSubmit无法在 Formik onSubmit 中设置错误
【发布时间】:2021-08-08 21:29:25
【问题描述】:

这几天我遇到了一些问题,我在 Formik 表单的 onSubmit 方法中设置的每个错误都没有添加到错误道具中。我的具体问题是关于 GraphQL API 返回的后端错误。我有一个很长的表格,所以我不会发布我的所有代码,但相关代码如下:

这是我的表单的 sn-p :

<Formik
  initialValues={initialValues}
  validationSchema={validationSchema}
  onSubmit={onSubmit}
>
  {({ errors, setFieldValue, touched, values }) => (
    <>
      {console.log(errors)}

      <Form>
        <div className="divided-by-2">
          <div className="street-number-and-street">
            <FormikTextField
              id="streetNumber"
              name="streetNumber"
              label={i18next.t('model:traveler.streetNumber')}
            />
            <FormikTextField
              id="street"
              name="street"
              label={i18next.t('model:traveler.street')}
            />
          </div>

          <FormikTextField
            id="city"
            name="city"
            label={i18next.t('model:traveler.city')}
          />

          <FormikTextField
            id="zip"
            name="zip"
            label={i18next.t('model:traveler.postCode')}
          />
        </div>
      </Form>
    </>
  )}
</Formik>

onSubmit 是我在 Formik 声明之外声明的函数,因为它非常广泛。如下:

const onSubmit = async (values, actions) => {
  const variables = {
    firstname: values.firstname,
    lastname: values.lastname,
    [The rest of my variables are also here including the ones in the above snippet]
  }

  const { data } = await profileUpdate({
    variables,
  });

  if (data.userUpdate.errors.length === 0) {
     const { data } = await usersRoleRequestCreate({
        variables: {
          role: 'explorer',
          note: values.note,
          token,
        },
      });

      if (data?.usersRoleRequestCreate?.errors.length > 0) {
        for (const error of data?.usersRoleRequestCreate?.errors) {
          console.log(error.attribute);
          const key = Mapping[error.attribute];
          if (key) {
            let message = '';
            for (const errorMessage of error.errors) {
              message += errorMessage.message;
            }
            actions.setFieldError(key, message)
          }
        }
    } else {
         [If no errors, success code here]
    }
  }
}

我曾尝试使用 setFieldError,如此处所示,但我也尝试使用 setErrors,使用 useState 创建一个对象来存储我的后端验证错误,然后将这些值分配给错误,所有这些都失败了。错误具有值的唯一事件是当我从 yup 验证模式收到前端错误时。 Formik 文档没有提供很多示例(https://formik.org/docs/api/formik),我真的想不通。

感谢您的帮助

【问题讨论】:

    标签: javascript reactjs validation asynchronous formik


    【解决方案1】:

    到现在为止,我一直在努力解决这个问题,最后,我解决了它。

    如果您设置了FieldError,然后执行了验证函数,这些错误将被覆盖。 我不知道这是否是最好的解决方案,但对我来说是有效的。

    const validate = (values) => {
            // let prevErr = formik.errors;
            const errors = {};
            console.log("inside validate", formik);
            if (!values.email) {
                if (!formik.errors.email) {
                    errors.email = "Required";
                } else {
                    errors.email = formik.errors.email;
                }
            } else if (
                !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(values.email)
            ) {
                errors.email = "Invalid email address";
            }
    
            if (!values.password) {
                if (!formik.errors.email) {
                    errors.password = "Required";
                } else {
                    errors.password = formik.errors.password;
                }
            }
    
            return errors;
        };
    
    const onError = (data) => {
            formik.setFieldError("email", "BackEnd Error");
            formik.setFieldError("password", "BackEnd Error");
        };
    

    尝试寻找解决方案的方法:

    • 初始值,必须设置
    • Console.log 验证函数内的表单,以查看您设置的错误何时加载到表单上。
    • 查看字段是否被触摸
    • 可能验证函数执行了两次以上,最终会覆盖这些错误,因为它们不再存在。

    让我知道这是否可行,这是我第一次在 Stack Overflow 上发布解决方案。

    谢谢!

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2020-01-03
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2020-03-29
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多