Ich habe ein paar Schaltflächen, die als Routen dienen. Jedes Mal, wenn die Route geändert wird, möchte ich sicherstellen, dass sich die aktive Schaltfläche ändert.
Gibt es eine Möglichkeit, Routenänderungen in React Router v4 abzuhören?
react-router-v4
Kasper
quelle
quelle
Antworten:
Ich benutze
withRouter
, um dielocation
Requisite zu bekommen . Wenn die Komponente aufgrund einer neuen Route aktualisiert wird, überprüfe ich, ob sich der Wert geändert hat:Ich hoffe es hilft
quelle
withRouter
, aber ich bekomme eine FehlermeldungYou should not use <Route> or withRouter() outside a <Router>
. Ich sehe keine<Router/>
Komponente im obigen Code. Wie funktioniert es?<Switch>
Komponente als De-facto-Router. Es wird nur der erste<Route>
Eintrag gerendert, der einen passenden Pfad hat.<Router/>
In diesem Szenario ist keine KomponenteUm das oben Gesagte zu erweitern, müssen Sie zum Verlaufsobjekt gelangen. Wenn Sie verwenden
BrowserRouter
, können SiewithRouter
Ihre Komponente importieren und mit einer Komponente höherer Ordnung (HoC) umschließen , um über Requisiten auf die Eigenschaften und Funktionen des Verlaufsobjekts zugreifen zu können.Das einzige, was Sie beachten müssen, ist, dass withRouter und die meisten anderen Zugriffsmöglichkeiten
history
auf die Requisiten verschmutzen, wenn sie das Objekt darin destrukturieren .quelle
withRoutes
zuwithRouter
.history
eher als die Variablelisten
.Sie sollten history v4 lib verwenden.
Beispiel von dort
quelle
history.push
das auslösthistory.listen
. Weitere Informationen finden Sie im Beispiel Verwenden einer Basis-URL in Verlauf v4-Dokumenten . Da dieshistory
tatsächlich ein Wrapper des nativenhistory
Objekts eines Browsers ist, verhält es sich nicht genau wie das native.const unlisten = history.listen(myListener); unlisten();
withRouter
,history.listen
UnduseEffect
(React Hooks) funktioniert zwar recht gut zusammen:Der Listener-Rückruf wird jedes Mal ausgelöst, wenn eine Route geändert wird, und die Rückgabe für
history.listen
ist ein Shutdown-Handler, mit dem gut gespielt werden kannuseEffect
.quelle
v5.1 führt den nützlichen Hook ein
useLocation
https://reacttraining.com/blog/react-router-v5-1/#uselocation
quelle
Cannot read property 'location' of undefined at useLocation
. Sie müssen sicherstellen, dass sich der Aufruf von useLocation () nicht in derselben Komponente befindet, die den Router in den BaumMit Haken:
Als
<DebugHistory>
Komponente importieren und rendernquelle
mit Haken
quelle
quelle
Mit React Hooks verwende ich
useEffect
quelle
In einigen Fällen können Sie auf diese Weise ein
render
Attribut anstelle von verwendencomponent
:Beachten Sie, dass beim Ändern des Status in der
onRouteChange
Methode der Fehler "Maximale Aktualisierungstiefe überschritten" auftreten kann.quelle
Mit dem
useEffect
Hook können Routenänderungen erkannt werden, ohne dass ein Listener hinzugefügt werden muss.quelle
Ich habe mich gerade mit diesem Problem befasst, daher werde ich meine Lösung als Ergänzung zu anderen Antworten hinzufügen.
Das Problem hierbei ist, dass
useEffect
es nicht wirklich so funktioniert, wie Sie es möchten, da der Aufruf erst nach dem ersten Rendern ausgelöst wird und es zu einer unerwünschten Verzögerung kommt.Wenn Sie einen Statusmanager wie Redux verwenden, besteht die Möglichkeit, dass Sie aufgrund des anhaltenden Status im Geschäft ein Flimmern auf dem Bildschirm erhalten.
Was Sie wirklich wollen, ist zu verwenden,
useLayoutEffect
da dies sofort ausgelöst wird.Also habe ich ein kleines Dienstprogramm geschrieben, das ich im selben Verzeichnis wie mein Router abgelegt habe:
Was ich innerhalb der Komponente HOC so aufrufe:
path
ist die Requisite, die bei dermatch
Verwendung im Objekt übergeben wirdwithRouter
.Ich bin nicht wirklich dafür, die Geschichte manuell anzuhören / abzuhören. Das ist nur imo.
quelle