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