In der aktuellen Version von React Router (v3) kann ich eine Serverantwort akzeptieren und verwenden browserHistory.push
, um zur entsprechenden Antwortseite zu gelangen. Dies ist jedoch in Version 4 nicht verfügbar, und ich bin mir nicht sicher, wie ich damit umgehen soll.
In diesem Beispiel ruft components / app-product-form.js unter Verwendung von Redux auf, this.props.addProduct(props)
wenn ein Benutzer das Formular sendet . Wenn der Server einen Erfolg zurückgibt, wird der Benutzer zur Warenkorbseite weitergeleitet.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
Wie kann ich von der Funktion für React Router v4 eine Umleitung zur Warenkorbseite vornehmen?
context
ist es ein "no go" , das zu verwenden , um das zu übergeben, was Sie manuell benötigen. Sofern ich kein Bibliotheksautor bin, sollte es nicht erforderlich sein, es zu verwenden. In der Tat empfiehlt Facebook dagegen.history
funktioniert auch für React Native als Option sowie als zusätzliche Option zur Unterstützung älterer Browser.Antworten:
Sie können die
history
Methoden außerhalb Ihrer Komponenten verwenden. Versuchen Sie es auf folgende Weise.Erstellen Sie zunächst ein
history
Objekt, das im Verlaufspaket verwendet wird :Wickeln Sie es dann ein
<Router>
( bitte beachten Sie, dass Sie esimport { Router }
anstelle von verwenden solltenimport { BrowserRouter as Router }
):Ändern Sie Ihren aktuellen Standort von einem beliebigen Ort aus, zum Beispiel:
UPD : Sie können auch ein etwas anderes Beispiel in den häufig gestellten Fragen zu React Router sehen .
quelle
history.push('some path')
ändert sich die URL, aber die Seite ändert sich nicht. Ich musswindow.location.reload()
einige Teile meines Codes danach einfügen, damit es funktioniert. In einem Fall muss ich jedoch den Redux-Statusbaum behalten, und das erneute Laden zerstört ihn. Irgendeine andere Lösung?withRouter
Komponente höherer Ordnung zu verwenden.import createHistory from 'history/createBrowserHistory'; export default createHistory();
wird Arbeit sein.React Router v4 unterscheidet sich grundlegend von v3 (und früheren Versionen) und Sie können nicht mehr so tun,
browserHistory.push()
wie Sie es früher getan haben .Diese Diskussion scheint verwandt zu sein, wenn Sie weitere Informationen wünschen:
Stattdessen haben Sie einige Möglichkeiten, dies zu tun:
Verwenden Sie die
withRouter
Komponente höherer OrdnungStattdessen sollten Sie die
withRouter
Komponente höherer Ordnung verwenden und diese in die Komponente einschließen, die in den Verlauf verschoben wird. Zum Beispiel:Weitere Informationen finden Sie in der offiziellen Dokumentation :
Verwenden Sie die
context
APIDie Verwendung des Kontexts ist möglicherweise eine der einfachsten Lösungen, aber als experimentelle API ist sie instabil und wird nicht unterstützt. Verwenden Sie es nur, wenn alles andere fehlschlägt. Hier ist ein Beispiel:
Schauen Sie sich die offizielle Dokumentation zum Kontext an:
quelle
this.context.router.history.push('/path');
Mit React-Router v5 können Sie jetzt den useHistory-Lifecycle-Hook wie folgt verwenden:
Lesen Sie mehr unter: https://reacttraining.com/react-router/web/api/Hooks/usehistory
quelle
let history = useHistory();
,Object is not callable
erhalte jedoch eine Fehlermeldung, als ich versuchte zu sehen, welche VerwendungHistorieconsole.log(useHistory)
als undefiniert angezeigt wird . using"react-router-dom": "^5.0.1"
Der einfachste Weg in React Router 4 ist die Verwendung
Um diese Methode verwenden zu können, sollte Ihre vorhandene Komponente Zugriff auf das
history
Objekt haben. Wir können Zugang bekommen durchWenn Ihre Komponente
Route
direkt mit verknüpft ist , hat Ihre Komponente bereits Zugriff auf dashistory
Objekt.z.B:
Hier
ViewProfile
hat Zugang zuhistory
.Wenn nicht
Route
direkt verbunden.z.B:
Dann müssen wir
withRouter
eine Funktion höherer Ordnung verwenden, um die vorhandene Komponente zu verziehen.Innerhalb
ViewUsers
Komponenteimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
Das war's jetzt, Ihre
ViewUsers
Komponente hat Zugriff auf dashistory
Objekt.AKTUALISIEREN
2
- Übergeben Sie in diesem Szenario alle Routenprops
an Ihre Komponente, und dann können wirthis.props.history
von der Komponente aus auch ohne eine zugreifenHOC
z.B:
quelle
this.props.history
) von einem HOC stammt, was bedeutet, dass sie nicht direkt mit dem verknüpft istRoute
, wie Sie erklären.So habe ich es gemacht:
Verwenden
this.props.history.push('/cart');
diese Option, um zur Warenkorbseite umzuleiten, die im Verlaufsobjekt gespeichert wird.Viel Spaß, Michael.
quelle
Gemäß der Dokumentation zu React Router v4 - Redux Deep Integration-Sitzung
Eine tiefe Integration ist erforderlich, um:
Sie empfehlen diesen Ansatz jedoch als Alternative zur "tiefen Integration":
So können Sie Ihre Komponente mit der withRouter-Komponente höherer Ordnung umschließen:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
Dadurch wird die Verlaufs-API an Requisiten übergeben. Sie können also den Aktionsersteller aufrufen, der den Verlauf als Parameter übergibt. Zum Beispiel in Ihrer ReactComponent:
Dann in Ihren Aktionen / index.js:
quelle
Die böse Frage hat mich ziemlich viel Zeit gekostet, aber schließlich habe ich sie folgendermaßen gelöst:
Wickeln Sie Ihren Container mit ein
withRouter
und übergeben Sie den Verlauf an IhremapDispatchToProps
funktionierende Aktion . Verwenden Sie in Aktion history.push ('/ url'), um zu navigieren.Aktion:
Container:
Dies gilt für Router v4.x Reagieren .
quelle
import { createBrowserHistory } from 'history'
.this.context.history.push
wird nicht funktionieren.Ich habe es geschafft, Push so zum Laufen zu bringen:
quelle
In diesem Fall geben Sie Requisiten an Ihren Thunk weiter. Sie können also einfach anrufen
Ist dies nicht der Fall, können Sie den Verlauf Ihrer Komponente trotzdem übergeben
quelle
Ich biete eine weitere Lösung an, falls es sich für jemand anderen lohnt.
Ich habe eine
history.js
Datei, in der ich Folgendes habe:Als nächstes verwende ich auf meinem Root, wo ich meinen Router definiere, Folgendes:
Schließlich
actions.js
importiere ich auf meinem Verlauf den Verlauf und benutze pushLaterAuf diese Weise kann ich nach API-Aufrufen neue Aktionen ausführen.
Ich hoffe es hilft!
quelle
Wenn Sie Redux verwenden, würde ich empfehlen, das npm-Paket react-router-redux zu verwenden . Sie können damit Redux-Store-Navigationsaktionen auslösen.
Sie müssen den Speicher wie in der Readme-Datei beschrieben erstellen .
Der einfachste Anwendungsfall:
Zweiter Anwendungsfall mit Container / Komponente:
Container:
Komponente:
quelle
next
Version, die sich derzeit noch in der Entwicklung befindet!Dies konnte ich mit erreichen
bind()
. Ich wollte auf eine Schaltfläche klickenindex.jsx
, einige Daten auf dem Server veröffentlichen, die Antwort auswerten und zu umleitensuccess.jsx
. So habe ich das herausgefunden ...index.jsx
::request.js
::success.jsx
::So durch Bindung
this
anpostData
inindex.jsx
, ich war in der Lage , den Zugangthis.props.history
inrequest.js
... dann kann ich diese Funktion wieder verwenden in verschiedenen Komponenten, so stellen müssen , dass ich mich erinnere enthaltenthis.postData = postData.bind(this)
in derconstructor()
.quelle
Hier ist mein Hack (dies ist meine Root-Level-Datei mit einem kleinen Redux - obwohl ich sie nicht benutze
react-router-redux
):Ich kann dann
window.appHistory.push()
überall verwenden, wo ich möchte (zum Beispiel in meinen Redux-Store-Funktionen / Thunks / Sagas usw.). Ich hatte gehofft, ich könnte es nur verwenden,window.customHistory.push()
aber aus irgendeinem Grundreact-router
schien es nie zu aktualisieren, obwohl sich die URL geändert hat. Aber auf diese Weise habe ich die EXACT-Instanzreact-router
verwendet. Ich mag es nicht, Dinge in den globalen Bereich zu stellen, und dies ist eines der wenigen Dinge, mit denen ich das machen würde. Aber es ist besser als jede andere Alternative, die ich IMO gesehen habe.quelle
Rückruf verwenden. Es hat bei mir funktioniert!
In der Komponente müssen Sie nur den Rückruf hinzufügen
quelle
So mache ich das: - Anstatt mit umzuleiten
history.push
, verwende ich nur dieRedirect
Komponente von.react-router-dom
Wenn Sie diese Komponente verwenden, können Sie sie einfach übergebenpush=true
, und sie kümmert sich um den Restquelle
Mit React Router V4 kann die Verlaufs-Requisite jetzt wie folgt verwendet werden:
Auf den Wert kann dann überall dort zugegriffen werden, wo die Standortstütze als
state:{value}
Nicht-Komponentenstatus verfügbar ist .quelle
Sie können es so verwenden, wie ich es für Login und Manny verschiedene Dinge mache
quelle
quelle
Schritt eins Wickeln Sie Ihre App in Router
Jetzt hat meine gesamte App Zugriff auf BrowserRouter. Schritt zwei Ich importiere Route und gebe diese Requisiten weiter. Wahrscheinlich in einer Ihrer Hauptdateien.
Wenn ich jetzt console.log (this.props) in meiner js-Komponentendatei ausführe, sollte ich etwas bekommen, das so aussieht
Schritt 2 Ich kann auf das Verlaufsobjekt zugreifen, um meinen Standort zu ändern
Außerdem bin ich nur ein Bootcamp-Student für Codierung, daher bin ich kein Experte, aber ich weiß, dass Sie auch Sie verwenden können
Korrigieren Sie mich, wenn ich falsch liege, aber als ich das getestet habe, wurde die gesamte Seite neu geladen, was meiner Meinung nach den gesamten Sinn der Verwendung von React zunichte gemacht hat.
quelle
Erstellen Sie eine benutzerdefinierte
Router
mit seiner eigenenbrowserHistory
:Router
Verwenden Sie als Nächstes auf Ihrer Wurzel, auf der Sie Ihre definieren , Folgendes:Importieren
history
Sie schließlich, wo Sie es benötigen, und verwenden Sie es:quelle
Wenn Sie den Verlauf verwenden möchten, während Sie eine Funktion als Wert an die Requisite einer Komponente übergeben, können Sie mit React-Router 4 die
history
Requisite einfach im Render-Attribut der<Route/>
Komponente zerstören und dann verwendenhistory.push()
Hinweis: Damit dies funktioniert, sollten Sie die BrowserRouter-Komponente von React Router um Ihre Stammkomponente wickeln (z. B. in index.js).
quelle