Mam router jak poniżej:
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute component={Index}/>
<Route path="login" component={Login}/>
</Route>
</Router>
Oto, co chcę osiągnąć:
- Przekieruj użytkownika do,
/login
jeśli nie jest zalogowany - Jeśli użytkownik próbował uzyskać dostęp,
/login
gdy jest już zalogowany, przekieruj go do roota/
więc teraz próbuję sprawdzić stan użytkownika w App
„s componentDidMount
, a następnie zrobić coś takiego:
if (!user.isLoggedIn) {
this.context.router.push('login')
} else if(currentRoute == 'login') {
this.context.router.push('/')
}
Problem polega na tym, że nie mogę znaleźć interfejsu API, aby uzyskać aktualną trasę.
Znalazłem ten zamknięty problem sugerowany przy użyciu funkcji obsługi miksu i tras Router.ActiveState, ale wygląda na to, że te dwa rozwiązania są teraz przestarzałe.
javascript
reactjs
react-router
wxtry
źródło
źródło
this.state.location.pathname
(zamiast rekwizytów).static contextTypes = { router: React.PropTypes.object }
Możesz uzyskać aktualną trasę za pomocą
const currentRoute = this.props.routes[this.props.routes.length - 1];
... co daje dostęp do rekwizytów z aktywnego
<Route ...>
komponentu najniższego poziomu .Dany...
<Route path="childpath" component={ChildComponent} />
currentRoute.path
wraca'childpath'
icurrentRoute.component
wracafunction _class() { ... }
.źródło
this.props.location
utraci te właściwości niestandardowe.this.props.routes.length - 2
Jeśli używasz historii, Router umieści wszystko w lokalizacji z historii, na przykład:
this.props.location.pathname; this.props.location.query;
zdobyć?
źródło
Od wersji 3.0.0 aktualną trasę można uzyskać dzwoniąc pod numer:
Przykładowy kod znajduje się poniżej:
var NavLink = React.createClass({ contextTypes: { router: React.PropTypes.object }, render() { return ( <Link {...this.props}></Link> ); } });
źródło
Dla wszystkich użytkowników, którzy mieli ten sam problem w 2017 roku, rozwiązałem go w następujący sposób:
NavBar.contextTypes = { router: React.PropTypes.object, location: React.PropTypes.object }
i użyj go w ten sposób:
componentDidMount () { console.log(this.context.location.pathname); }
źródło
PropTypes
jest teraz samodzielna zależność, myślę dodać:import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
W
App.js
dodać poniższy kod i spróbujwindow.location.pathname
źródło
Możesz użyć właściwości „isActive” w następujący sposób:
const { router } = this.context; if (router.isActive('/login')) { router.push('/'); }
isActive zwróci wartość true lub false.
Przetestowano za pomocą React-router 2.7
źródło
U mnie działa w ten sam sposób:
... <MyComponent {...this.props}> <Route path="path1" name="pname1" component="FirstPath"> ... </MyComponent> ...
Następnie mogę uzyskać dostęp do „this.props.location.pathname” w funkcji MyComponent.
Zapomniałem, że to ja ...))) Poniższy link opisuje więcej dla paska nawigacji itp .: zareaguj router this.props.location
źródło
Spróbuj złapać ścieżkę za pomocą:
document.location.pathname
W JavaScript możesz aktualny adres URL w częściach. Sprawdź: https://css-tricks.com/snippets/javascript/get-url-and-url-parts-in-javascript/
źródło