简体   繁体   English

React Bootstrap + Formik - 单击提交按钮后显示错误

[英]React Bootstrap + Formik - show errors after I click submit button

In my app I use React Bootstrap and Formik.在我的应用程序中,我使用 React Bootstrap 和 Formik。 I want the bootstrap to show that field is invalid (for example is not an email but should be) after I press the submit button.我希望引导程序在我按下提交按钮后显示该字段无效(例如不是电子邮件,但应该是)。 And then when I start typing new values to fields it should disappear.然后当我开始在字段中输入新值时,它应该会消失。 In the tutorial I used I only found the way to show that field is invalid only at the same moment the user is typing the values?在我使用的教程中,我只找到了在用户输入值的同时显示该字段无效的方法?

How to do that?怎么做? How to set isInvalid to show errors only after submit using Formik?如何设置isInvalid仅在使用 Formik 提交后才显示错误?

Here is my current code这是我当前的代码

import * as yup from "yup";
import React from "react";
import Form from "react-bootstrap/Form";
import Button from "react-bootstrap/Button";
import {Formik} from "formik";
import {loginActions} from "../_actions/loginActions";
import {connect} from "react-redux";
import {loginService} from "../_services";

const schema = yup.object().shape({
    username: yup.string().email("Login musi być w formie e-mail").required("Wypełnij pole login"),
    password: yup.string().required("Wypełnij pole hasło")
});

class LoginForm extends React.Component {

    constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleSubmit(e) {
        const {username, password} = e;
        if (username && password) {
            loginService
                .login(username, password)
                .then(
                    success => {
                        const data = success.data;
                        if (success.status === 200 && data.success === true) {
                            return {...data.user, password: password};
                        } else if (success.status === 400) {
                            window.location.reload();
                        }
                        const error = (!data.success && "Wrong credentials") || success.statusText;
                        return Promise.reject(error);
                    }
                )
                .then(auth => {
                    this.props.login(auth)
                })
        }
    }

    render() {
        return (
            <Formik
                validationSchema={schema}
                onSubmit={e => this.handleSubmit(e)}
                initialValues={{username: '', password: ''}}>
                {
                    formProps => (
                        <Form name='form' onSubmit={formProps.handleSubmit}>
                            <Form.Group noValidate controlId="loginForm.username">
                                <Form.Label>Adres e-mail</Form.Label>
                                <Form.Control
                                    type="text"
                                    name="username"
                                    value={formProps.values.username}
                                    onChange={formProps.handleChange}
                                    isInvalid={!!formProps.errors.username}
                                />
                                <Form.Control.Feedback type="invalid">
                                    {formProps.errors.username}
                                </Form.Control.Feedback>
                            </Form.Group>
                            <Form.Group controlId="loginForm.password">
                                <Form.Label>Hasło</Form.Label>
                                <Form.Control
                                    type="password"
                                    name="password"
                                    value={formProps.values.password}
                                    onChange={formProps.handleChange}
                                >
                                </Form.Control>
                                <Form.Control.Feedback type="invalid">
                                    {formProps.errors.password}
                                </Form.Control.Feedback>
                            </Form.Group>
                            <Form.Group controlId="loginForm.loginBtn">
                                <Button variant="primary" type="submit">
                                    Zaloguj się
                                </Button>
                                {formProps.isSubmitting &&
                                (
                                    <img
                                        src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=="
                                    />)
                                }
                            </Form.Group>
                        </Form>
                    )
                }
            </Formik>
        )
    }
}


function mapState(state) {
    const {session} = state;
    return {session}
}

const connectedLoginForm = connect(mapState, {login: loginActions.login})(LoginForm);
export {connectedLoginForm as LoginForm};

Formik validation runs, onChange , onBlur and onSubmit respectively. Formik验证分别运行onChangeonBluronSubmit So in your case if you want it to be validated only on submit, you should pass validateOnChange , validateOnBlur props as false.因此,在您的情况下,如果您希望仅在提交时对其进行验证,则应将validateOnChangevalidateOnBlur道具传递为 false。

<Formik
   initialValues={{ email: '', password: '' }}
   validationSchema={LoginSchema}
   validateOnChange={false}
   validateOnBlur={false}
   onSubmit={values => onLogin(values)}>
     ...
 />

暂无
暂无

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

相关问题 单击两次提交按钮,React Formik onSubmit RestAPI被调用两次 - React Formik onSubmit RestAPI called twice, once click a submit button Formik 如何在表单提交时显示错误 - Formik How to Show Errors When Form Submit Formik 表单仅在第二个按钮单击后验证? (使用 React Hooks,TypeScript,Formik,NextJS) - Formik form only validates after second button click? (Using React Hooks, TypeScript, Formik, NextJS) Formik 触发错误并触及非提交类型的按钮点击。 我们如何仅在单击(type =“submit”)按钮时触发 - Formik triggering errors and touched on non submit type button click. How can we only trigger when (type="submit") button clicked 反应formik禁用提交按钮与表单有效性 - react formik disable submit button with form validity react-bootstrap-sweetalert 如何在第一次点击后禁用提交按钮? - react-bootstrap-sweetalert how to disable submit button after first click? 提交 React 表单后,如何清除 Bootstrap 4 错误? - How do I clear Bootstrap 4 errors after I submit my React form? {React Native} 提交后重置 Formik 表单 - {React Native} Resetting Formik form after submit React Formik 使用 onSubmit 函数绑定外部按钮点击<Formik> - React Formik bind the external button click with onSubmit function in <Formik> 第一个 React-Bootstrap 单选按钮单击未触发 Formik 表单中的“触摸” - First React-Bootstrap Radio Button Click is not triggering "touched" in Formik Form
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM