[英]Unable to set `isSubmitting` with Formik
As it turns out, it was working all along -- the issue was because my handleLogin
method was async
事实证明,它一直在工作——问题是因为我的handleLogin
方法是async
的
New sandbox:新沙盒:
I have a basic Form component.我有一个基本的表单组件。 It passes setSubmitting
as one of the available methods, and it passes isSubmitting
as well.它通过setSubmitting
作为可用方法之一,它也通过isSubmitting
。 I want to disable the submit button while the form is submitting, but I'm having trouble with this.我想在提交表单时禁用提交按钮,但我遇到了麻烦。
Initially, I had a <form>
element and I was trying to set setSubmitting(true)
in the below part:最初,我有一个<form>
元素,我试图在下面的部分设置setSubmitting(true)
:
<form
onSubmit={(credentials) => {
setSubmitting(true); // <--
handleSubmit(credentials);
}}
>
But this didn't work.但这没有用。 So I've tried getting rid of the <form>
and changing <Button>
to type="button"
instead of submit
, and I did,所以我尝试摆脱<form>
并将<Button>
更改为type="button"
而不是submit
,我做到了,
<Button
color="primary"
disabled={isSubmitting}
fullWidth
size="large"
type="button"
variant="contained"
onClick={() => {
setSubmitting(true);
handleLogin(values);
}}
>
Submit
</Button>
But the problem with this, is that in order to do setSubmitting(false)
in case of an error is that I have to do this,但是这样做的问题是,为了在发生错误的情况下执行setSubmitting(false)
是我必须这样做,
onClick={() => {
setSubmitting(true);
handleLogin(values, setSubmitting); // <--
}}
And in addition to this, I have no use for onSubmit={handleLogin}
, but if I remove that, Typescript complains.除此之外,我没有使用onSubmit={handleLogin}
,但如果我删除它,Typescript 会抱怨。
There's got to be an easier way to accomplish this (without using useFormik
).必须有一种更简单的方法来实现这一点(不使用useFormik
)。
What can I do here?我可以在这里做什么?
Here is the component:这是组件:
import * as React from "react";
import { Formik } from "formik";
import { Box, Button, TextField } from "@material-ui/core";
const Form = React.memo(() => {
const handleLogin = React.useCallback(async (credentials, setSubmitting) => {
console.log(credentials);
setTimeout(() => {
setSubmitting(false);
}, 2000);
}, []);
return (
<Formik
initialValues={{
email: ""
}}
onSubmit={handleLogin} // removing this line make Typescript complain
>
{({
handleSubmit,
handleChange,
setSubmitting,
isSubmitting,
values
}) => (
<div>
<TextField
fullWidth
label="Email"
margin="normal"
name="email"
onChange={handleChange}
value={values.email}
variant="outlined"
/>
<Box sx={{ my: 2 }}>
<Button
color="primary"
disabled={isSubmitting}
fullWidth
size="large"
type="button"
variant="contained"
onClick={() => {
setSubmitting(true);
handleLogin(values, setSubmitting);
}}
>
Submit
</Button>
</Box>
</div>
)}
</Formik>
);
});
export default Form;
You forget to put the form
inside your Formik
component您忘记将form
放入Formik
组件中
<Formik>
{...}
<form onSubmit={handleSubmit}>
{...}
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</form>
</Formik>
so now you can use your button as submit
.所以现在你可以使用你的按钮作为submit
。
demo: https://stackblitz.com/edit/react-egp1gc?file=src%2FForm.js演示: https://stackblitz.com/edit/react-egp1gc?file=src%2FForm.js
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.