Jak uzyskać aktualną trasę w React-router 2.0.0-rc5

83

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ąć:

  1. Przekieruj użytkownika do, /loginjeśli nie jest zalogowany
  2. Jeśli użytkownik próbował uzyskać dostęp, /logingdy 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.

wxtry
źródło

Odpowiedzi:

112

Po przeczytaniu kolejnego dokumentu znalazłem rozwiązanie:

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md

Muszę tylko uzyskać dostęp do wstrzykniętej właściwości locationwystąpienia komponentu, na przykład:

var currentLocation = this.props.location.pathname
wxtry
źródło
5
Jest niedostępny w niektórych komponentach podrzędnych, ale udało mi się je przekazać za pomocą rekwizytu.
Damjan Pavlica
1
Dla mnie (v2.8.1) był dostępny przez this.state.location.pathname(zamiast rekwizytów).
internet-nico
2
Musisz upewnić się, że dodasz to do swojego komponentu static contextTypes = { router: React.PropTypes.object }
Alex Cory
1
jeśli jest on niedostępny w swoich elementów podrzędnych, wystarczy owinąć użyciu withRouter ()
Michael Brown
Dzięki, link jest pomocny!
Alex Yursha
27

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.pathwraca 'childpath'i currentRoute.componentwraca function _class() { ... }.

colllin
źródło
1
Jest to świetna metoda, ponieważ zachowuje wszelkie niestandardowe właściwości zdefiniowane na trasie. this.props.locationutraci te właściwości niestandardowe.
XtraSimplicity,
Aby uzyskać poprzednią trasę (np. Przycisk Wstecz + etykieta), możesz użyćthis.props.routes.length - 2
devonj
10

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ć?

jeden
źródło
13
może możesz rozszerzyć swoją odpowiedź, aby mieć więcej danych wejściowych i kilka odniesień? w tej chwili jest to zbyt ogólne
Farside
8

Od wersji 3.0.0 aktualną trasę można uzyskać dzwoniąc pod numer:

this.context.router.location.pathname

Przykładowy kod znajduje się poniżej:

var NavLink = React.createClass({
    contextTypes: {
        router: React.PropTypes.object
    },

    render() {   
        return (
            <Link {...this.props}></Link>
        );
    }
});
Sithu
źródło
7

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);
}
Aotik
źródło
1
Jak PropTypesjest teraz samodzielna zależność, myślę dodać: import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
logicalicy
4

W App.jsdodać poniższy kod i spróbuj

window.location.pathname
Tuan Nguyen
źródło
2

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

MarvinVK
źródło
0

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

Alex
źródło