简体   繁体   English

无法使用 Formik 设置“isSubmitting”

[英]Unable to set `isSubmitting` with Formik

Edit编辑

As it turns out, it was working all along -- the issue was because my handleLogin method was async事实证明,它一直在工作——问题是因为我的handleLogin方法是async

New sandbox:新沙盒:

古怪-lichterman-vwhmd?


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;

信任-northcutt-kn6mn?

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.

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