Mit react-router
kann ich das Link
Element verwenden, um Links zu erstellen, die nativ vom Reaktionsrouter verarbeitet werden.
Ich sehe intern, dass es anruft this.context.transitionTo(...)
.
Ich möchte eine Navigation machen. Nicht von einem Link, sondern von einer Dropdown-Auswahl (als Beispiel). Wie kann ich das im Code machen? Was ist this.context
?
Ich habe das Navigation
Mixin gesehen, aber kann ich das ohne machen mixins
?
reactjs
react-router
George Mauer
quelle
quelle
Antworten:
useHistory
In React Router> 5.1.0 gibt es einen neuen Hook, wenn Sie React> 16.8.0 und Funktionskomponenten verwenden.In Version 4 von React Router gibt es drei Ansätze für das programmatische Routing innerhalb von Komponenten.
withRouter
Komponente höherer Ordnung.<Route>
context
.React Router ist meistens ein Wrapper um die
history
Bibliothek.history
Erledigt die Interaktion mit den Browsernwindow.history
für Sie mit den Browser- und Hash-Historien. Es bietet auch einen Speicherverlauf, der für Umgebungen ohne globalen Verlauf nützlich ist. Dies ist besonders nützlich bei der Entwicklung mobiler Apps (react-native
) und beim Testen von Einheiten mit Node.Eine
history
Instanz verfügt über zwei Navigationsmethoden:push
undreplace
. Wenn Sie sich dashistory
als Array von besuchten Standortenpush
vorstellen, fügen Sie dem Array einen neuen Standort hinzu undreplace
ersetzen den aktuellen Standort im Array durch den neuen. Normalerweise möchten Sie diepush
Methode beim Navigieren verwenden.In früheren Versionen von Router Reaktion, hatten Sie eine eigene erstellen
history
Instanz, sondern in v4 das<BrowserRouter>
,<HashRouter>
und<MemoryRouter>
Komponenten wird eine Browser, Hash und Speicher - Instanzen für Sie erstellen. React Router stellt die Eigenschaften und Methoden derhistory
Ihrem Router zugeordneten Instanz über den Kontext unter demrouter
Objekt zur Verfügung.1. Verwenden Sie die
withRouter
Komponente höherer OrdnungDie
withRouter
Komponente höherer Ordnung injiziert dashistory
Objekt als Requisite der Komponente. Auf diese Weise können Sie auf die Methodenpush
und zugreifenreplace
, ohne sich mit den Methoden befassen zu müssencontext
.2. Verwenden Sie Komposition und rendern Sie a
<Route>
Die
<Route>
Komponente dient nicht nur zum Abgleichen von Standorten. Sie können eine weglose Route rendern , die immer mit dem aktuellen Standort übereinstimmt . Die<Route>
Komponente übergibt dieselben Requisiten wiewithRouter
, sodass Siehistory
über diehistory
Requisite auf die Methoden zugreifen können .3. Verwenden Sie den Kontext *
Aber du solltest es wahrscheinlich nicht
Die letzte Option sollten Sie nur verwenden, wenn Sie mit dem Kontextmodell von React vertraut sind (die Kontext-API von React ist ab Version 16 stabil).
1 und 2 sind die am einfachsten zu implementierenden Optionen. In den meisten Anwendungsfällen sind sie die besten Wetten.
quelle
withRouter
anstatthistory
alle meine Komponenten weiterzugeben? Gahh, ich muss mehr Zeit damit verbringen, Dokumente zu lesen ...history.push('/new-location')
ohne dieses Verhalten an eine Schaltfläche oder ein anderes DOM-Element anzuhängen?Unexpected use of 'history' no-restricted-globals
context
ist ab Reaktion 16 nicht mehr experimentell.Sie können den neuen
useHistory
Hook für Funktionskomponenten verwenden und programmgesteuert navigieren:Verwenden Sie in 4.0 und höher den Verlauf als Requisite Ihrer Komponente.
HINWEIS: this.props.history ist nicht vorhanden, falls Ihre Komponente nicht von gerendert wurde
<Route>
. Sie sollten<Route path="..." component={YourComponent}/>
this.props.history in YourComponent verwendenVerwenden Sie in Version 3.0 und höher den Router als Requisite Ihrer Komponente.
Verwenden Sie in Version 2.4 und höher eine Komponente höherer Ordnung, um den Router als Requisite Ihrer Komponente zu erhalten.
Diese Version ist abwärtskompatibel mit 1.x, sodass kein Upgrade-Handbuch erforderlich ist. Nur die Beispiele durchzugehen, sollte gut genug sein.
Wenn Sie jedoch zum neuen Muster wechseln möchten, befindet sich im Router ein browserHistory-Modul, auf das Sie zugreifen können
import { browserHistory } from 'react-router'
Jetzt haben Sie Zugriff auf Ihren Browserverlauf, sodass Sie beispielsweise Push, Ersetzen usw. ausführen können.
browserHistory.push('/some/path')
Weiterführende Literatur: Geschichten und Navigation
Ich werde nicht auf die Aktualisierung von Details eingehen. Sie können dies im Upgrade-Handbuch nachlesen
Die wichtigste Änderung bei dieser Frage ist der Wechsel vom Navigationsmixin zum Verlauf. Jetzt wird die Browser-Verlaufs-API verwendet, um die Route zu ändern, sodass wir sie
pushState()
von nun an verwenden werden.Hier ist ein Beispiel mit Mixin:
Beachten Sie, dass dies
History
aus einem Rackt / History- Projekt stammt. Nicht vom React-Router selbst.Wenn Sie Mixin aus irgendeinem Grund nicht verwenden möchten (möglicherweise aufgrund der ES6-Klasse), können Sie auf den Verlauf zugreifen, den Sie vom Router erhalten
this.props.history
. Es ist nur für die von Ihrem Router gerenderten Komponenten zugänglich. Wenn Sie es also in untergeordneten Komponenten verwenden möchten, muss es als Attribut über übergeben werdenprops
.Weitere Informationen zur neuen Version finden Sie in der Dokumentation zu 1.0.x.
Hier ist eine Hilfeseite speziell zum Navigieren außerhalb Ihrer Komponente
Es wird empfohlen, sich eine Referenz zu schnappen
history = createHistory()
und diese aufzurufenreplaceState
.Ich hatte das gleiche Problem und konnte die Lösung nur mit dem Navigationsmixin finden, das mit dem React-Router geliefert wird.
So habe ich es gemacht
Ich konnte anrufen,
transitionTo()
ohne darauf zugreifen zu müssen.context
Oder probieren Sie den schicken ES6
class
React-Router-Redux verfügt über einige Methoden, die eine einfache Navigation innerhalb von Aktionserstellern ermöglichen. Diese können besonders nützlich sein für Benutzer mit vorhandener Architektur in React Native, die dieselben Muster in React Web mit minimalem Aufwand für die Boilerplate verwenden möchten.
Erforschen Sie die folgenden Methoden:
push(location)
replace(location)
go(number)
goBack()
goForward()
Hier ist ein Anwendungsbeispiel mit Redux-Thunk :
./actioncreators.js
./viewcomponent.js
quelle
v2.4.0
aber der erwähnte Ansatz funktioniert bei mir nicht, meine App wird überhaupt nicht gerendert und die Konsole wird ausgegeben:Uncaught TypeError: (0 , _reactRouter.withRouter) is not a function
Hier ist der Link zu meinem SO-Beitrag: stackoverflow.com/questions/37306166/…2.6.0
.3.0.x
? Viele Leute scheinen dencontext
Weg zu benutzen .this.props.history
existiert nicht für den Fall, dass Ihre Komponente nicht von gerendert wurde<Route>
. Sie sollten verwenden<Route path="..." component={YourComponent}/>
, umthis.props.history
in zu habenYourComponent
.Für die neueste Version (
v2.0.0-rc5
) wird empfohlen, direkt auf den Verlaufssingleton zu klicken. Sie können dies in Aktion im Dokument Navigieren außerhalb von Komponenten sehen .Relevanter Auszug:
Bei Verwendung der neueren API-Router reagieren, müssen Sie die Verwendung von die machen
history
aus ,this.props
wenn innerhalb der Komponenten so:Es bietet auch,
pushState
aber das ist pro protokollierten Warnungen veraltet.Bei Verwendung
react-router-redux
bietet es einepush
Funktion, die Sie wie folgt versenden können:Dies kann jedoch nur verwendet werden, um die URL zu ändern, nicht um tatsächlich zur Seite zu navigieren.
quelle
import { browserHistory } from './react-router'
sondern mithilfe von Verlauf erstelltimport createBrowserHistory from 'history/lib/createBrowserHistory'
. Später können Siehistory
von den Komponenten Requisiten zugreifen :this.props.history('/some/path')
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
push
ändert nur die URL, ändert die Seite jedoch nicht. Um beides zu tun, importieren SiebrowserHistory
ausreact-router
und verwenden SiebrowserHistory.push('/my-cool-path')
. Leider ist dies nicht sehr leicht zu finden. github.com/reactjs/react-router/blob/master/docs/guides/…react-router
v4So machen Sie das
react-router v2.0.0
mit ES6 .react-router
hat sich von Mixins entfernt.quelle
history
von @Bobby angegebenen Singleton zu verwenden . Sie könnten verwenden,context.router
aber Sie machen es wirklich schwierig, diese Komponenten einem Komponententest zu unterziehen, da die Instanziierung nur dieser Komponente dies nicht im Kontext hat.Am Ende möchte ich ein einzelnes Verlaufsobjekt haben, das ich auch außerhalb von Komponenten tragen kann. Was ich gerne mache, ist, eine einzelne Datei history.js zu haben, die ich bei Bedarf importiere, und sie einfach zu bearbeiten.
Sie müssen nur
BrowserRouter
zu Router wechseln und die Verlaufsstütze angeben. Dies ändert nichts für Sie, außer dass Sie über ein eigenes Verlaufsobjekt verfügen, das Sie nach Belieben bearbeiten können.Sie müssen installieren Geschichte , die Bibliothek , die von
react-router
.Anwendungsbeispiel, ES6-Notation:
history.js
BasicComponent.js
Wenn Sie von einer Komponente aus navigieren müssen, die tatsächlich von einer
Route
Komponente gerendert wurde , können Sie auch über Requisiten wie folgt auf den Verlauf zugreifen:BasicComponent.js
quelle
Router
stattdessen verwenden solltenBrowserRouter
.BrowserRouter
erstellt und pflegt dashistory
Objekt für Sie. Sie sollten nicht standardmäßig Ihre eigenen erstellen, nur wenn Sie ["eine tiefe Integration mit State-Management-Tools wie Redux benötigen."] Reacttraining.com/react-router/web/api/Routerthis.props.history
, habe ich noch keine Lösung gefunden, die mir dabei helfen kann, so etwas in einer Klasse zu tun, die keine Komponente oder ein anderes Tool ist, das nicht als React-Komponente erstellt wurde Sie können Requisiten weitergeben. Vielen Dank für Ihr Feedback :)Für diesen, der die Serverseite nicht kontrolliert und aus diesem Grund den Hash-Router v2 verwendet:
Platzieren Sie Ihren Verlauf in einer separaten Datei (z. B. app_history.js ES6):
Und überall einsetzen!
Ihr Einstiegspunkt für den React-Router (app.js ES6):
Ihre Navigation in einer beliebigen Komponente (ES6):
quelle
history
jetzt für beide Ansätze zu verwendentl: dr;
Die einfache und deklarative Antwort ist, dass Sie
<Redirect to={URL} push={boolean} />
in Kombination mit verwenden müssensetState()
Vollständiges Beispiel hier . Lesen Sie hier mehr .
PS. In diesem Beispiel werden ES7 + -Eigenschaftsinitialisierer verwendet, um den Status zu initialisieren. Schauen Sie auch hier , wenn Sie interessiert sind.
quelle
withRouter
hat nicht funktioniert, als sie sich bereits auf der Route befand, die neu geladen wird. In unserem Fall mussten wir selektiv entweder tunsetState
(verursachenreturn <Redirect>
), wenn wir bereits auf der Route waren oderhistory.push()
von woanders.Sie können dies auch ohne Mixins tun.
Das Problem mit Kontexten ist, dass es nur zugänglich ist, wenn Sie das
contextTypes
für die Klasse definieren.Was den Kontext betrifft, handelt es sich um ein Objekt wie Requisiten, das vom Elternteil an das Kind weitergegeben wird, aber implizit weitergegeben wird, ohne dass Requisiten jedes Mal neu deklariert werden müssen. Siehe https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html
quelle
Ich habe mindestens 10 Möglichkeiten ausprobiert, bevor etwas richtig funktioniert hat!
Die
withRouter
Antwort von @Felipe Skinner war für mich etwas überwältigend und ich war mir nicht sicher, ob ich neue Klassennamen "ExportedWithRouter" erstellen wollte.Hier ist der einfachste und sauberste Weg, dies zu tun, z. B. der aktuelle React-Router 3.0.0 und ES6:
oder, wenn es nicht Ihre Standardklasse ist, exportieren Sie wie folgt:
Beachten Sie, dass in 3.xx die
<Link>
Komponente selbst verwendet wirdrouter.push
, sodass Sie alles übergeben können, was Sie dem<Link to=
Tag übergeben würden, z.quelle
200 OK
statt30x
Code. Wie kann ich dieses Problem beheben?Um die Navigation programmgesteuert durchzuführen , müssen Sie einen neuen Verlauf in die props.history in Ihrem Verzeichnis verschieben
component
, damit so etwas die Arbeit für Sie erledigen kann:quelle
Für ES6 + React-Komponenten hat die folgende Lösung für mich funktioniert.
Ich folgte Felippe Skinner, fügte aber eine End-to-End-Lösung hinzu, um Anfängern wie mir zu helfen.
Unten sind die Versionen, die ich verwendet habe:
Unten ist meine Reaktionskomponente, in der ich die programmatische Navigation mit dem Reaktionsrouter verwendet habe:
Unten ist die Konfiguration für meinen Router:
quelle
Vielleicht nicht der beste Ansatz, aber ... Mit dem React-Router v4 könnte das folgende Typoskript für einige eine Idee geben.
In der gerenderten Komponente unten, zum Beispiel
LoginPage
,router
Objekt zugänglich ist und rufen Sie einfachrouter.transitionTo('/homepage')
zu navigieren.Navigationscode wurde entnommen aus .
"react-router": "^4.0.0-2",
"react": "^15.3.1",
quelle
Sie können
withRouter
und verwendenthis.props.history.push
.quelle
Zur Verwendung
withRouter
mit einer klassenbasierten Komponente, versuchen Sie so etwas wie dies unten. Vergessen Sie nicht, die zu verwendende Exportanweisung zu ändernwithRouter
:import { withRouter } from 'react-router-dom'
quelle
basierend auf der vorherigen Antwort
von José Antonio Postigo und Ben Wheeler
die Neuheit? wird in geschrieben werden Typoskript
und die Verwendung von Dekorateure
oder statische Eigenschaft / Feld
mit was auch immer npm heute installiert. "React-Router": "^ 3.0.0" und
"@ types / React-Router": "^ 2.0.41"
quelle
Mit React-Router v4 am Horizont gibt es jetzt eine neue Möglichkeit, dies zu tun.
React-Lego ist eine Beispiel-App, die zeigt, wie der React-Router verwendet / aktualisiert wird. Sie enthält Beispielfunktionstests, die in der App navigieren.
quelle
In React Router v4. Ich folge diesen beiden Wegen, um programmgesteuert zu routen.
Nummer zwei
Um Verlauf in Requisiten zu erhalten, müssen Sie möglicherweise Ihre Komponente mit einwickeln
quelle
Wenn Sie einen Hash- oder Browserverlauf verwenden, können Sie dies tun
quelle
hashHistory.push
, gibt die Eigenschaft "Push" von undefined nicht lesen. Woher importieren Sie diese?Mit der aktuellen React-Version (15.3)
this.props.history.push('/location');
funktionierte für mich, aber es zeigte die folgende Warnung:und ich habe es so gelöst
context.router
:quelle
React-Router V4
Wenn Sie Version 4 verwenden, können Sie meine Bibliothek (Shameless Plug) verwenden, in der Sie einfach eine Aktion auslösen und alles funktioniert!
Trippler
quelle
Diejenigen, die Probleme bei der Implementierung auf dem React-Router v4 haben.
Hier ist eine funktionierende Lösung für die Navigation durch die React-App aus Redux-Aktionen.
history.js
App.js / Route.jsx
another_file.js ODER Redux-Datei
Alles dank diesem Kommentar: ReactTraining gibt einen Kommentar heraus
quelle
Wenn Sie RR4 mit Redux durch React -Router-Redux koppeln , können Sie auch die Routing-Aktionsersteller von verwenden
react-router-redux
.Wenn Sie Redux Thunk / Saga verwenden, um den asynchronen Fluss zu verwalten, importieren Sie die oben genannten Aktionsersteller in Redux-Aktionen und haken Sie ein, um Komponenten mit mapDispatchToProps zu reagieren.
quelle
react-router-redux
wurde für eine lange Zeit veraltet / archiviertSie können den
useHistory
Hook auch in einer zustandslosen Komponente verwenden. Beispiel aus den Dokumenten.quelle
Die richtige Antwort war zum Zeitpunkt des Schreibens für mich
Sie müssen Ihrer Komponente jedoch PropTypes hinzufügen
Vergessen Sie nicht, PropTypes zu importieren
quelle
Vielleicht nicht die beste Lösung, aber sie erledigt den Job:
Grundsätzlich ruft eine an eine Aktion gebundene Logik (in diesem Fall eine Nachlöschung) einen Auslöser für die Umleitung auf. Dies ist nicht ideal, da Sie Ihrem Markup einen DOM-Knoten-Trigger hinzufügen, damit Sie ihn bei Bedarf bequem aufrufen können. Außerdem interagieren Sie direkt mit dem DOM, was in einer React-Komponente möglicherweise nicht erwünscht ist.
Diese Art der Umleitung ist jedoch nicht so oft erforderlich. Ein oder zwei zusätzliche, versteckte Links in Ihrem Komponenten-Markup würden also nicht so weh tun, besonders wenn Sie ihnen aussagekräftige Namen geben.
quelle
Dies funktionierte für mich, es waren keine speziellen Importe erforderlich:
quelle
history
hinzugefügtprops
. Das kommt von einem HoC, den Sie importieren müssten, um es zu verwenden (Komponenten, die direkt an gesendet werden,Route
werden automatisch von diesem HoC verpackt, aber dann benötigen Sie einen Import fürRoute
...)Verwenden Sie stattdessen Hookrouter, die moderne Alternative zum React-Router
https://www.npmjs.com/package/hookrouter
Um die OP-Frage zum Verknüpfen über ein Auswahlfeld zu beantworten, können Sie Folgendes tun:
quelle
Angenommen, Sie müssen während des ersten Renderns (für das Sie die
<Redirect>
Komponente verwenden können) nicht navigieren. Dies tun wir in unserer App.Definieren Sie eine leere Route, die null zurückgibt. Auf diese Weise erhalten Sie Zugriff auf das Verlaufsobjekt. Sie müssen dies auf der obersten Ebene tun, auf der Ihre
Router
definiert ist.Jetzt können Sie alle die Dinge tun , die auf getan werden kann Geschichte wie
history.push()
,history.replace()
,history.go(-1)
usw.!quelle
React-Router-Dom: 5.1.2
Diese Seite hat 3 Seiten, die alle dynamisch im Browser gerendert werden.
Beachten Sie, dass React Router die URL beim Navigieren durch die Site auf dem neuesten Stand hält, obwohl die Seite nie aktualisiert wird. Dadurch bleibt der Browserverlauf erhalten, und es wird sichergestellt, dass Dinge wie die Schaltfläche "Zurück" und Lesezeichen ordnungsgemäß funktionieren
Ein Switch durchsucht alle untergeordneten Elemente und rendert das erste, dessen Pfad mit der aktuellen URL übereinstimmt. Verwenden Sie eine, wenn Sie mehrere Routen haben, aber jeweils nur eine davon rendern soll
quelle
In meiner Antwort gibt es also drei verschiedene Möglichkeiten, programmgesteuert zu einer Route umzuleiten. Einige der Lösungen wurden bereits vorgestellt, die folgenden konzentrierten sich jedoch nur auf Funktionskomponenten mit einer zusätzlichen Demo-Anwendung.
Verwenden der folgenden Versionen:
Aufbau:
Die Lösung verwendet also zunächst
HashRouter
Folgendes:Aus der Dokumentation über
<HashRouter>
:Lösungen:
<Redirect>
zum Schieben mituseState
:In einer Funktionskomponente (
RedirectPushAction
Komponente aus meinem Repository) können wir dieuseState
Umleitung verwenden. Ein schwieriger Teil ist, dass wir nach der Umleitung denredirect
Status wieder herstellen müssenfalse
. Durch die Verwendung vonsetTimeOut
mit0
Verzögerung warten wir , bis Commits ReagierenRedirect
auf das DOM dann auf die Schaltfläche , um immer wieder beim nächsten Mal zu verwenden.Nachfolgend finden Sie mein Beispiel:
Aus der
<Redirect>
Dokumentation:useHistory
Haken:In meiner Lösung gibt es eine Komponente namens
UseHistoryAction
, die Folgendes darstellt:withRouter
erhalten Sie diehistory
vonprops
:Erstellt eine Komponente mit dem Namen
WithRouterAction
, wird wie folgt angezeigt:Lesen aus der
withRouter
Dokumentation:Demo:
Zur besseren Darstellung habe ich ein GitHub-Repository mit diesen Beispielen erstellt. Nachfolgend finden Sie es:
https://github.com/norbitrial/react-router-programmatisch-redirect-examples
Ich hoffe das hilft!
quelle