简体   繁体   English

Formik 的“isSubmitting”何时设置回 False?

[英]When is Formik's "isSubmitting" set back to False?

I have a simple Formik form where the Submit method simply outputs to the console.我有一个简单的 Formik 表单,其中 Submit 方法只是输出到控制台。 The structure is结构是

// Submit Form: Custom method referenced in Formik
const submitForm = async (formValues) => {
    console.log(JSON.stringify(formValues));
};

<Formik 
    enableReinitialize
    validationSchema={schema}
    onSubmit={ (values) => {
        submitForm(values); // call my custom Submit method above
    }}
    initialValues={initialFormValues}
>
    {
        ({handleSubmit, handleChange, values, touched, errors, isSubmitting}) 
        => (
            <Form onSubmit={handleSubmit}> {/* Form starts here */}
                ...
                <Button type="submit" disabled={isSubmitting}>Search</Button>
            </Form>
       )
     }
   </Formik>

If there are validation errors, the Submit button correctly ends up enabled after clicking.如果存在验证错误,则提交按钮在单击后正确地结束启用。 But if there are no validation errors, I output to the console, and Submit stays disabled even though I'm done.但是,如果没有验证错误,我将 output 发送到控制台,即使我完成了,提交也会保持禁用状态 At what point is isSubmitting set back to FALSE in this example?在此示例中,什么时候isSubmitting设置回 FALSE?

Adding to digitalbreeds answer, actually Formik does reset isSubmitting to false , when your onSubmit handler returns a Promise.添加到 digitalbreeds 答案,实际上当您的onSubmit处理程序返回 Promise 时,Formik 确实将isSubmitting重置为false

See in the docs :请参阅文档

IMPORTANT: If onSubmit is async, then Formik will automatically set isSubmitting to false on your behalf once it has resolved.重要提示:如果 onSubmit 是异步的,那么一旦解决,Formik 将代表您自动将 isSubmitting 设置为 false。 This means you do NOT need to call formikBag.setSubmitting(false) manually.这意味着您不需要手动调用 formikBag.setSubmitting(false)。 However, if your onSubmit function is synchronous, then you need to call setSubmitting(false) on your own.但是,如果你的 onSubmit function 是同步的,那么你需要自己调用 setSubmitting(false) 。

Not at all.一点也不。 Formik doesn't know when your submit is done, so you need to do it yourself. Formik 不知道您的提交何时完成,因此您需要自己完成。 Formik actually passes the setter into your submit handler for exactly that reason.正是出于这个原因,Formik 实际上将 setter 传递到您的提交处理程序中。

Change your code to this:将您的代码更改为:

onSubmit={(values, { setSubmitting }) => {
    submitForm(values, setSubmitting);
}}

and then in your submitForm method, call setSubmitting(false) when done, eg in a finally block.然后在您的submitForm方法中,完成后调用setSubmitting(false) ,例如在finally块中。

Its work form me它的工作形式我

onSubmit={(values, actions) => {
     setTimeout(() => {
       alert(JSON.stringify(values, null, 2));
       actions.setSubmitting(false);
     }, 1000);
   }}

ref: https://formik.org/docs/api/formik#setsubmitting-issubmitting-boolean-void参考: https : //formik.org/docs/api/formik#setsubmitting-issubmitting-boolean-void

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM