我正在使用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函数不起作用。我不知道为什么?请告诉我我的代码有什么问题?
答案 0 :(得分:12)
检查您的validationSchema
。我遇到了这个问题,发现我的验证器正在向Formik发送信号,表明该表单无效,但是没有其他警告或消息出现。它只是不会提交。
用validator={() => ({})}
替换道具,即只返回一个空对象。那应该通过验证并触发您的onSubmit。您可以从那里恢复功能。
<Formik
initialValues={{
email: ""
}}
onSubmit={() => { console.log("submit!"); }}
validator={() => ({})}
>
{/* */}
</Formik>
答案 1 :(得分:8)
在我的情况下,我使用Yup
作为验证器,并且在我的firstName
中意外地有lastName
和validationSchema
,但是我的表单中没有这些值。
我的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')
})
我刚刚删除了firstName
和lastName
,
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
,所以我遇到了同样的问题。该问题已通过导入 Form
的 formik
解决。
答案 5 :(得分:-1)
在我为我工作时使用而不是按钮标签。