Почему Formik.setStatus не обновляет состояние в моей форме? - PullRequest
0 голосов
/ 22 февраля 2020

Я использую Formik для создания общей c контактной формы в реакции. Я получаю данные из моего API и пытаюсь вызвать Formik setStatus, чтобы сгенерировать сообщение, показывающее, что форма была успешно отправлена.

По какой-либо причине состояние Status никогда не обновляется, чтобы отразить то, что я введите setStatus.

Вот мой код:

import { Formik, Form, useField } from "formik";
import * as Yup from "yup";
import axios from "axios";
import Button from "components/shared/button";
import "styles/contact/form.scss";

const handleSubmit = (values, actions) => {
    axios.post("http://localhost:5000/sendemail/", values).then(res => {
        actions.setSubmitting(false);
        actions.setStatus = {
            message: res.data.message
        };
        setTimeout(() => {
            actions.resetForm();
        }, 3000);
    });
};

const FormField = ({ label, tagName, ...props }) => {
    const [field, meta] = useField(props);
    const errorClass = meta.touched && meta.error ? "error" : "";
    const TagName = tagName;
    return (
        <>
            <label htmlFor={props.id || props.name}>
                {label}
                {meta.touched && meta.error ? (
                    <span className="error">{meta.error}</span>
                ) : null}
            </label>
            <TagName
                className={`form-control ${errorClass}`}
                {...field}
                {...props}
            />
        </>
    );
};

const ContactForm = () => (
    <Formik
        initialValues={{ name: "", email: "", msg: "" }}
        validationSchema={Yup.object({
            name: Yup.string().required("Required"),
            email: Yup.string()
                .email("Invalid email address")
                .required("Required"),
            msg: Yup.string().required("Required")
        })}
        onSubmit={handleSubmit}>
        {({ isSubmitting, status }) => (
            <Form className="contact-form">
                <div className="row form-group">
                    <div className="col">
                        <FormField
                            label="Name"
                            name="name"
                            type="text"
                            tagName="input"
                        />
                    </div>
                    <div className="col">
                        <FormField
                            label="Email"
                            name="email"
                            type="text"
                            tagName="input"
                        />
                    </div>
                </div>
                <div className="form-group">
                    <FormField label="Message" name="msg" tagName="textarea" />
                </div>
                {status && status.message && (
                    <div className="message">{status.message}</div>
                )}
                <Button
                    id="formSubmit"
                    text="Send Message"
                    type="submit"
                    isSubmitting={isSubmitting}
                />
            </Form>
        )}
    </Formik>
);

export default ContactForm;

Непосредственно перед моей кнопкой отправки, она должна показать <div class="message">Success message</div> после отправки формы. Когда я пытаюсь отладить, значение Status всегда «неопределено».

У кого-нибудь есть подсказка, что я тут делаю неправильно?

1 Ответ

0 голосов
/ 22 февраля 2020

Причина, по которой это не сработало, заключается в том, что я попытался установить значение setStatus равным объекту. То, что я должен был сделать, это использовать его как метод и передать объект в качестве параметра.

Примерно так:

actions.setStatus({message: res.data.message});

Я чувствую себя глупо, что так долго упускаю эту простую ошибку.

...