J'utilise la dernière version du module react-router, nommé react-router-dom, qui est devenu la valeur par défaut lors du développement d'applications Web avec React. Je souhaite savoir comment effectuer une redirection après une requête POST. J'ai créé ce code, mais après la demande, rien ne se passe. Je passe en revue sur le Web, mais toutes les données concernent les versions précédentes du routeur React, et non avec la dernière mise à jour.
Code:
import React, { PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { Redirect } from 'react-router'
import SignUpForm from '../../register/components/SignUpForm';
import styles from './PagesStyles.css';
import axios from 'axios';
import Footer from '../../shared/components/Footer';
class SignUpPage extends React.Component {
constructor(props) {
super(props);
this.state = {
errors: {},
client: {
userclient: '',
clientname: '',
clientbusinessname: '',
password: '',
confirmPassword: ''
}
};
this.processForm = this.processForm.bind(this);
this.changeClient = this.changeClient.bind(this);
}
changeClient(event) {
const field = event.target.name;
const client = this.state.client;
client[field] = event.target.value;
this.setState({
client
});
}
async processForm(event) {
event.preventDefault();
const userclient = this.state.client.userclient;
const clientname = this.state.client.clientname;
const clientbusinessname = this.state.client.clientbusinessname;
const password = this.state.client.password;
const confirmPassword = this.state.client.confirmPassword;
const formData = { userclient, clientname, clientbusinessname, password, confirmPassword };
axios.post('/signup', formData, { headers: {'Accept': 'application/json'} })
.then((response) => {
this.setState({
errors: {}
});
<Redirect to="/"/> // Here, nothings happens
}).catch((error) => {
const errors = error.response.data.errors ? error.response.data.errors : {};
errors.summary = error.response.data.message;
this.setState({
errors
});
});
}
render() {
return (
<div className={styles.section}>
<div className={styles.container}>
<img src={require('./images/lisa_principal_bg.png')} className={styles.fullImageBackground} />
<SignUpForm
onSubmit={this.processForm}
onChange={this.changeClient}
errors={this.state.errors}
client={this.state.client}
/>
<Footer />
</div>
</div>
);
}
}
export default SignUpPage;
javascript
reactjs
react-router
maoooricio
la source
la source
Redirect
ressemble à JSX, pas JS.Réponses:
Vous devez utiliser
setState
pour définir une propriété qui rendra l'<Redirect>
intérieur de votrerender()
méthode.Par exemple
Vous pouvez également voir un exemple dans la documentation officielle: https://reacttraining.com/react-router/web/example/auth-workflow
Cela dit, je vous suggère de mettre l'appel API dans un service ou quelque chose. Ensuite, vous pouvez simplement utiliser l'
history
objet pour router par programme. C'est ainsi que fonctionne l' intégration avec redux .Mais je suppose que vous avez vos raisons de le faire de cette façon.
la source
put the API call inside a service or something
?componentDidMount
. Ou mieux encore, créez un HOC qui «enveloppe» votre API.Redirect
appellehistory.replace
. Si vous souhaitez accéder à l'history
objet, utilisezwithRoutet
/Route
.react-router
> = 5.1 inclut maintenant des crochets, vous pouvez donc simplementconst history = useHistory(); history.push("/myRoute")
Voici un petit exemple en réponse au titre car tous les exemples mentionnés sont compliqués à mon avis ainsi que celui officiel.
Vous devez savoir comment transpiler es2015 et rendre votre serveur capable de gérer la redirection. Voici un extrait pour express. Plus d'informations à ce sujet peuvent être trouvées ici .
Assurez-vous de mettre ceci sous toutes les autres routes.
Il s'agit du fichier .jsx. Remarquez comment le chemin le plus long vient en premier et devenez plus général. Pour les itinéraires les plus généraux, utilisez l'attribut exact.
la source
home/hello
>home/hello/1
mais allez àhome/hello
et appuyez sur Entrée, elle ne redirigera pas la première fois. des idées pourquoi ??Appelez-le simplement dans n'importe quelle fonction que vous aimez.
la source
React Router v5 vous permet désormais de rediriger simplement en utilisant history.push () grâce au hook useHistory () :
la source
Essayez quelque chose comme ça.
la source
Vous pouvez également utiliser
withRouter
. Vous pouvez accéder auxhistory
propriétés et les plus proches de l' objet<Route>
« smatch
via lewithRouter
composant d'ordre supérieur.withRouter
transmettra les accessoires mis à jourmatch
,location
ethistory
au composant encapsulé chaque fois qu'il sera rendu.Ou juste:
la source
vous pouvez écrire un hoc à cet effet et écrire une redirection d'appel de méthode, voici le code:
la source
Pour accéder à une autre page (page À propos dans mon cas), j'ai installé
prop-types
. Ensuite, je l'importe dans le composant correspondant.Et je l'aithis.context.router.history.push('/about')
utilisé.Et il est parcouru.Mon code est,
la source
Pour accéder à un autre composant, vous pouvez utiliser
this.props.history.push('/main');
la source
Warning: Cannot update during an existing state transition (such as within
render). Render methods should be a pure function of props and state.
La solution la plus simple pour naviguer vers un autre composant est (Exemple navigue vers le composant de messagerie en cliquant sur l'icône):
la source
Vous pouvez également utiliser le rendu conditionnel React.
la source