Lorsqu'une action réussit, la redirection ne fonctionne pas mais history.replace fonctionne. Pourquoi ??
import React, { Component } from "react"; import { Formik, Form, Field, ErrorMessage } from "formik"; import * as Yup from "yup"; import { withRouter } from "react-router-dom"; class Login extends Component { constructor(props) { super(props); } render() { return ( <div id="loginContainer" className="signinup-container"> <h3 className="mb-4"> Log In </h3> <Formik initialValues={{ email: "", password: "", rememberMe: false, error: "" }} validationSchema={Yup.object().shape({ email: Yup.string() .required("Please enter email to login.") .email("Please enter a valid email."), password: Yup.string().required("Please enter your password.") })} onSubmit={(values, { resetForm, setErrors, setSubmitting }) => { setTimeout(() => { console.log("Logging in", values); setSubmitting(false); return <Redirect to="/dashboard" />; //this.props.history.replace("/dashboard"); //this.props.history.push('/dashboard'); }, 500); }} > {props => { const { values, touched, errors, isSubmitting, handleChange } = props; return ( <Form id="loginForm" className="signinupForm" noValidate> <ErrorMessage name="error" component="span" className="login-error" /> <div className="form-group "> <label className="form-label" htmlFor="email"> Email </label> <Field type={"email"} name="email" placeholder="Enter your email" className={ "form-control" + (errors.email && touched.email ? " is-invalid" : "") } /> <ErrorMessage name="email" component="span" className="invalid-input" /> </div> {/* Email */} <div className="form-group position-relative"> <label className="form-label" htmlFor="password"> Password </label> <Field type={"password"} name="password" placeholder="Enter your password" className={ "form-control" + (errors.password && touched.password ? " is-invalid" : "") } /> <ErrorMessage name="password" component="span" className="invalid-input" /> </div> {/* Password */} <div className="form-group"> <label className="form-label" htmlFor="rememberMe"> <input type="checkbox" id="rememberMe" name="rememberMe" onChange={handleChange} defaultChecked={values.rememberMe} value={values.rememberMe} /> Remember me </label> </div> {/* Rememeber Me */} {isSubmitting ? ( <span className="loader-gif">loading</span> ) : null} <button type="submit" className="btn btn-filled" disabled={isSubmitting} > Login </button> {/*Submit */} </Form> ); }} </Formik> </div> ); } } export default withRouter(Login);
Veuillez aller sur la page de connexion et vérifier ceci. Lien Codesandbox - https://codesandbox.io/s/winter-hooks-s9vgx
3 Réponses :
Vous devez utiliser la barre oblique:
to='/dashboard'
Vous appelez votre composant Redirect JSX à partir de la méthode onSubmit. Cependant, vous ne pouvez pas le faire car vous devez renvoyer les éléments JSX à partir de la méthode de rendu, c'est pourquoi vous devez utiliser historique pour mettre à jour la route
onSubmit={(values, { resetForm, setErrors, setSubmitting }) => { setTimeout(() => { console.log("Logging in", values); setSubmitting(false); this.props.history.replace("/dashboard"); }, 500);
Merci @ shubham-khatri Pouvez-vous s'il vous plaît examiner ce bogue -> stackoverflow.com/questions/58502707/...
Bonjour @ Shubham-Khatri, pouvez-vous s'il vous plaît m'aider dans ce titre - stackoverflow.com/questions/58809648/… Je suis bloqué depuis 3 jours
Comme l'a dit @Shubham Khatri , mais si vous souhaitez utiliser
vous pouvez créer un état et détecter s'il est connecté, puis le rediriger, comme ceci .
Les changements s'ajoutent
this.setState({ isLoggedIn: true });
Et dans le rendu
if (this.state.isLoggedIn) return <Redirect to="/dashboard" />;
dans onSubmit
this.state = { isLoggedIn: false };
Salut @Michael Pouvez-vous s'il vous plaît examiner ceci - stackoverflow.com/questions/58809648/...
Bonjour Michael, aidez-moi s'il vous plaît dans ce problème - stackoverflow.com/q/59408716/7682925