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 parshouldComponentUpdate
, il est important quewithRouter
enveloppe le composant qui implémenteshouldComponentUpdate
. 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;