J'ai un routeur comme ci-dessous:
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute component={Index}/>
<Route path="login" component={Login}/>
</Route>
</Router>
Voici ce que je veux réaliser:
/login
s'il n'est pas connecté/login
alors qu'il est déjà connecté, redirigez-le vers la racine /
alors maintenant j'essaie de vérifier l'état de l'utilisateur dans App
's componentDidMount
, puis faire quelque chose comme:
if (!user.isLoggedIn) {
this.context.router.Push('login')
} else if(currentRoute == 'login') {
this.context.router.Push('/')
}
Le problème ici est que je ne trouve pas l'API pour obtenir l'itinéraire actuel.
J'ai trouvé ce problème fermé suggéré d'utiliser des gestionnaires de mixage et de routage Router.ActiveStateState, mais il semble que ces deux solutions soient désormais obsolètes.
Après avoir lu un peu plus de document, j'ai trouvé la solution:
https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md
J'ai juste besoin d'accéder à la propriété injectée location
de l'instance du composant comme:
var currentLocation = this.props.location.pathname
Vous pouvez obtenir l'itinéraire actuel en utilisant
const currentRoute = this.props.routes[this.props.routes.length - 1];
... qui vous donne accès aux accessoires du composant <Route ...>
actif le plus bas.
Donné...
<Route path="childpath" component={ChildComponent} />
currentRoute.path
renvoie 'childpath'
et currentRoute.component
renvoie function _class() { ... }
.
Si vous utilisez l'historique, alors le routeur place tout dans l'emplacement de l'historique, tel que:
this.props.location.pathname;
this.props.location.query;
trouver?
Depuis la version 3.0.0, vous pouvez obtenir l'itinéraire actuel en appelant:
this.context.router.location.pathname
Exemple de code est ci-dessous:
var NavLink = React.createClass({
contextTypes: {
router: React.PropTypes.object
},
render() {
return (
<Link {...this.props}></Link>
);
}
});
Pour tous les utilisateurs ayant le même problème en 2017, je l'ai résolu de la manière suivante:
NavBar.contextTypes = {
router: React.PropTypes.object,
location: React.PropTypes.object
}
et l'utiliser comme ça:
componentDidMount () {
console.log(this.context.location.pathname);
}
Vous pouvez utiliser le prop 'isActive' comme ceci:
const { router } = this.context;
if (router.isActive('/login')) {
router.Push('/');
}
isActive retournera un vrai ou un faux.
Testé avec react-router 2.7
essayez dans App.js window.location.pathname
Fonctionne pour moi de la même manière:
...
<MyComponent {...this.props}>
<Route path="path1" name="pname1" component="FirstPath">
...
</MyComponent>
...
Et puis, je peux accéder à "this.props.location.pathname" dans la fonction MyComponent.
J'avais oublié que c’était ce que je suis ...))) Le lien suivant en dit plus sur la barre de navigation, etc: réagir routeur this.props.location