Naviguer par programme en utilisant le routeur réactif

Je développe une application dans laquelle je vérifie si l'utilisateur n'est pas loggedin Je dois afficher le formulaire de connexion, sinon envoyer une action qui modifierait l'itinéraire et charger d'autres composants. loggedin mon code:

  render() { if (isLoggedIn) { // dispatch an action to change the route } // return login component <Login /> } 

Comment puis-je atteindre ceci car je ne peux pas changer les états dans la fonction de rendu.

Étant donné que vous utilisez le react-router v4

Utilisez votre composant avec withRouter et utilisez withRouter partir des accessoires pour modifier l'itinéraire

 import {withRouter} from 'react-router'; class App extends React.Component { ... render() { if (isLoggedIn) { // dispatch an action to change the route this.props.history.push('/home'); } // return login component return <Login /> } } export default withRouter(App); 

Note importante

Si vous utilisez withRouter pour éviter que les mises à jour ne soient bloquées par shouldComponentUpdate , il est important que withRouter enveloppe le composant qui implémente shouldComponentUpdate . Par exemple, lors de l'utilisation de Redux:

// Cela contourne shouldComponentUpdate

 withRouter(connect(...)(MyComponent)) 

// Cela ne fonctionne pas

 connect(...)(withRouter(MyComponent)) 

Avec le react-router v2 or react-router v3 , vous pouvez utiliser le context pour modifier dynamiquement l'itinéraire comme

 class App extends React.Component { ... render() { if (isLoggedIn) { // dispatch an action to change the route this.context.router.push('/home'); } // return login component return <Login /> } } App.contextTypes = { router: React.PropTypes.object.isRequired } export default App; 

Ou utiliser

 import { browserHistory } from 'react-router'; browserHistory.push('/some/path'); 

En version réactive-routeur 4:

 import React from 'react' import { BrowserRouter as Router, Route, Redirect} from 'react-router-dom' const Example = () => ( if (isLoggedIn) { <OtherComponent /> } else { <Router> <Redirect push to="/login" /> <Route path="/login" component={Login}/> </Router> } ) const Login = () => ( <h1>Form Components</h1> ... ) export default Example;