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.

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

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() { ... }.


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


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>
        );
    }
});

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);
}

1
Jak PropTypesjest teraz samodzielna zależność, myślę dodać: import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
logicalicy


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


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.