Programmgesteuertes Navigieren Sie mittels der Reaktion-router
Bin ich eine Anwendung entwickeln, in der ich überprüfen, ob der Benutzer nicht loggedIn
ich habe zu der Anzeige des login-Formular, sonst dispatch
eine action
würde, dass die route zu ändern und laden andere Komponente. Hier ist mein code:
render() {
if (isLoggedIn) {
//dispatch an action to change the route
}
//return login component
<Login />
}
Wie kann ich das erreichen, wie kann ich nicht ändern Staaten innerhalb render-Funktion.
- Mögliche Duplikate von Programmgesteuertes navigieren, zu reagieren-router
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn man bedenkt Sie sind mit
react-router v4
Verwenden Sie Ihre Komponente mit
withRouter
und verwendenhistory.push
von Requisiten, um die route zu ändern. Sie brauchen, um machen Verwendung vonwithRouter
nur, wenn Ihre Komponente nicht empfangen dieRouter
Requisiten, das kann passieren, in den Fällen, wenn Ihre Komponente eine verschachtelte Kind von einer Komponente erbracht, die durch den Router und Sie nicht bestanden haben die Router Requisiten, um es, oder wenn die Komponente keine Verbindung mit dem Router und wird so dargestellt, als separate Komponente aus den Routen.oder verwenden Sie Umleiten
Mit
react-router v2 or react-router v3
Sie können Gebrauch machen voncontext
dynamisch die route zu ändern, wieoder verwenden Sie
history.pushState
von überall...<a/>
Elemente ausreichen würde) zum Beispiel...browserHistory
option scheint nicht mehr zu funktionieren (v4.3.1). OriginalwithRouter
+this.props.history.push(...)
tut aberIn reagieren-router version 4:
Andere alternative ist es zu handhaben mit Thunk-Stil asynchronen Aktionen (die sind sicher/haben darf, die Nebenwirkungen).
Wenn Sie Thunk, können Sie Spritzen den gleichen
history
Objekt in Ihrem<Router>
Komponente und Thunk-Aktionen mitthunk.withExtraArgument
wie diese:Dann im action-Macher, Sie haben
history
Instanz, das ist sicher mit ReactRouter, so können Sie nur auslösen, eine regelmäßige Redux-Ereignis, wenn Sie nicht angemeldet:Ein weiterer Vorteil ist, dass die url ist einfacher zu handhaben, jetzt, so können wir setzen redirect info auf den query-string, etc.
Können Sie versuchen noch, dies zu tun überprüfen Sie in Ihrem Render-Methoden, aber wenn es Probleme gibt, sollten Sie überlegen, es zu tun in
componentDidMount
oder an anderer Stelle im Lebenszyklus (obwohl auch ich den Wunsch verstehen, stick mit Zustandslose Funktionale Compeonents!)Können Sie immer noch verwenden Redux und
mapDispatchToProps
zu injizieren, die Aktion Schöpfer in Ihr comptonent, so Ihre Komponente ist nur noch lose mit Redux.Dies ist mein Griff
loggedIn
.react-router v4
PrivateRoute zulassen, geben Sie
path
wenn der Benutzer loggedIn und speichern den token zulocalStorge
Definieren Sie alle Pfade, die in Ihrer app hier
Diejenigen, die Probleme bei der Umsetzung dieser auf reagieren-router v4. Hier ist eine funktionierende Lösung für die Navigation durch die app reagieren programmgesteuert.
history.js
App.js ODER Route.jsx. Pass-Geschichte als eine requisite zu Ihrem Router.
Können Sie
push()
zu navigieren.Alles Dank dieser Kommentar: https://github.com/ReactTraining/react-router/issues/3498#issuecomment-301057248
Ich würde vorschlagen, Sie verwenden verbunden-reagieren-router https://github.com/supasate/connected-react-router
das hilft, um ausführen die navigation auch aus Reduzier - /Aktionen, wenn Sie wollen.
es ist gut dokumentiert und einfach zu konfigurieren
Konnte ich
history
innerhalb zustandslose funktionale Komponente, mit withRouter folgenden Weise (benötigt, um zu ignorieren, Typoskript Warnung):