So erhalten Sie die aktuelle Route in React-Router 2.0.0-rc5


83

Ich habe einen Router wie unten:

<Router history={hashHistory}>
    <Route path="/" component={App}>
        <IndexRoute component={Index}/>
        <Route path="login" component={Login}/>
    </Route>
</Router>

Folgendes möchte ich erreichen:

  1. Leiten Sie den Benutzer zu weiter, /loginwenn er nicht angemeldet ist
  2. Wenn der Benutzer versucht hat, auf ihn zuzugreifen, /loginwenn er bereits angemeldet ist, leiten Sie ihn an root weiter/

so jetzt versuche ich , Benutzer-Zustand zu lesen Appist componentDidMount, dann so etwas wie:

if (!user.isLoggedIn) {
    this.context.router.push('login')
} else if(currentRoute == 'login') {
    this.context.router.push('/')
}

Das Problem hier ist, dass ich die API zum Abrufen der aktuellen Route nicht finden kann.

Ich fand dieses geschlossene Problem mit der Verwendung von Router.ActiveState-Mixin- und Routen-Handlern vorgeschlagen, aber es sieht so aus, als wären diese beiden Lösungen jetzt veraltet.

Antworten:


112

Nachdem ich ein weiteres Dokument gelesen hatte, fand ich die Lösung:

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

Ich muss nur auf die injizierte Eigenschaft locationder Instanz der Komponente zugreifen, wie:

var currentLocation = this.props.location.pathname

5
Es ist in einigen untergeordneten Komponenten nicht verfügbar, aber ich habe es geschafft, sie per Requisite zu übergeben.
— Damjan Pavlica

1
Für mich (v2.8.1) war es über this.state.location.pathname(anstelle von Requisiten) verfügbar .
— Internet-Nico

2
Sie müssen sicherstellen, dass Sie dies zu Ihrer Komponente hinzufügen static contextTypes = { router: React.PropTypes.object }
— Alex Cory

1
Wenn es in Ihren untergeordneten Komponenten nicht verfügbar ist, müssen Sie nur mit withRouter ()
— Michael Brown

Danke, der Link ist hilfreich!
— Alex Yursha

27

Sie können die aktuelle Route mit abrufen

const currentRoute = this.props.routes[this.props.routes.length - 1];

... mit dem Sie von der aktivsten <Route ...>Komponente der untersten Ebene aus auf die Requisiten zugreifen können .

Gegeben...

<Route path="childpath" component={ChildComponent} />

currentRoute.pathkehrt zurück 'childpath'und currentRoute.componentkehrt zurück function _class() { ... }.


1
Dies ist eine großartige Methode, da alle auf der Route definierten benutzerdefinierten Eigenschaften beibehalten werden. this.props.locationverliert diese benutzerdefinierten Eigenschaften.
— XtraSimplicity

Und um die vorherige Route zu erhalten (dh für einen Zurück-Button + Etikett), können Sie verwendenthis.props.routes.length - 2
— Devonj

10

Wenn Sie den Verlauf verwenden, fügt der Router alles aus dem Verlauf an den Speicherort ein, z.

this.props.location.pathname;
this.props.location.query;

Kapiert?


13
Vielleicht können Sie Ihre Antwort erweitern, um mehr Input und einige Referenzen zu haben? im
— Moment ist

8

Ab Version 3.0.0 können Sie die aktuelle Route abrufen, indem Sie Folgendes aufrufen:

this.context.router.location.pathname

Beispielcode ist unten:

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

    render() {   
        return (
            <Link {...this.props}></Link>
        );
    }
});

7

Für alle Benutzer, die 2017 das gleiche Problem hatten, habe ich es folgendermaßen gelöst:

NavBar.contextTypes = {
    router: React.PropTypes.object,
    location: React.PropTypes.object
}

und benutze es so:

componentDidMount () {
    console.log(this.context.location.pathname);
}

1
Wie PropTypesist nun eine eigenständige Abhängigkeit, dachte hinzuzufügen: import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
— logicalicy

4

In App.jsfügen Sie den folgenden Code und versuchen

window.location.pathname

2

Sie können die 'isActive'-Requisite wie folgt verwenden:

const { router } = this.context;
if (router.isActive('/login')) {
    router.push('/');
}

isActive gibt ein wahres oder falsches zurück.

Getestet mit React-Router 2.7


0

Funktioniert bei mir genauso:

...
<MyComponent {...this.props}>
  <Route path="path1" name="pname1" component="FirstPath">
  ...
</MyComponent>
...

Und dann kann ich in der MyComponent-Funktion auf "this.props.location.pathname" zugreifen.

Ich habe vergessen, dass ich es war ...))) Der folgende Link beschreibt mehr für die Navigationsleiste usw.: Reagiere Router this.props.location


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.