【发布时间】:2022-01-19 17:34:54
【问题描述】:
在这里进入一个新的代码库,这也是我第一次使用 Formik 和 Yup,所以我会尽量简洁,但请耐心等待。
我有一些使用 Formik 构建的表单,并使用 Yup 提供的验证模式。我还有一个 useState 变量来指示 Yup 的 errors 对象中是否存在一个项目,该对象用于防止用户继续下一个表单,直到错误得到修复。验证最初可以正常工作,因为当提供无效输入时,errors 对象中会显示相应的错误。但是,如果我在字段中输入有效的内容,然后返回并更改它以使其无效,则 errors 对象不会更新以反映该新错误,直到下一个输入事件,这会抛出状态的值变量检查它。一个基本的例子:
输入邮箱:testgmail.com ---> errors:{email: "Invalid email"}
输入邮箱:test@gmail.com ---> errors:{}
输入邮箱:test@gmail ---> errors:{}
直到我触发下一个输入,errors 才会填充回{email: "Invalid email"}。
知道如何解决这个问题吗?我将尝试在下面提供一些清理过的代码,但再次道歉,因为它对我来说是一个全新的代码库,所以我不确定它会有多大用处。
const validate = Yup.object().shape({
name: Yup.string().required("This field is required"),
email: Yup.string()
.email("Invalid email format")
.required("Your email is required"),
code: Yup.string().required("This field is required"),
});
function handleInputChange(e: any, errors: FormikErrors, errorSetter: any, codeSetter: any, codeInfo: any) {
codeSetter({ ...codeInfo, [e.target.name]: e.target.value });
if (Object.keys(errors).length > 0) {
errorSetter(true);
}
else errorSetter(false)
}
<Formik
initialValues={{
name: codeInfo.name,
email: codeInfo.email,
code: codeInfo.code,
}}
onSubmit={() => {}}
validationSchema={validate}
>
{({
handleSubmit,
handleChange,
values,
errors,
touched,
handleBlur,
}) => (
<form className={styles.form} onSubmit={handleSubmit}>
<div className={styles.formTextfields}>
<div className={styles.textfields}>
<span className={styles.tag}>Email*</span>
<TextField
name="email"
value={values.email}
placeholder="test@gmail.com"
onChange={handleChange}
onBlur={handleBlur}
onInput={(e: any) => handleInputChange(e, errors)}
variant={
errors.email && touched.email ? "error" : "focus"
}
/>
{errors.email && touched.email ? (
<div className={styles.error}>{errors.email}</div>
) : null}
</div>
</form>
)}
</Formik>
【问题讨论】:
标签: reactjs typescript formik yup