Wenn ich gerade Dashboard/Daten besuche und auf die Zurück-Schaltfläche des Browsers klicke, gehe ich (zum Beispiel) zu Dashboard/Benutzer, aber die hervorgehobene Registerkarte bleibt immer noch auf Dashboard/Daten (Wert = 2).
Ich kann den Status ändern, indem ich den Status festlege, aber ich weiß nicht, wie ich mit dem Ereignis umgehen soll, wenn die Zurück-Schaltfläche des Browsers gedrückt wird.
Ich habe das gefunden:
window.onpopstate = this.onBackButtonEvent;
aber dies wird jedes Mal aufgerufen, wenn der Status geändert wird (nicht nur beim Zurück-Button-Ereignis)
Jay Shin
Dies ist eine etwas alte Frage, und Sie haben Ihre Antwort wahrscheinlich bereits erhalten, aber für Leute wie mich, die diese benötigt haben, hinterlasse ich diese Antwort.
Die Verwendung von React-Router machte die Arbeit so einfach:
import { browserHistory } from 'react-router';
componentDidMount() {
super.componentDidMount();
this.onScrollNearBottom(this.scrollToLoad);
this.backListener = browserHistory.listen(location => {
if (location.action === "POP") {
// Do your stuff
}
});
}
componentWillUnmount() {
super.componentWillUnmount();
// Unbind listener
this.backListener();
}
funktioniert bei mir nicht. Bei Verwendung von „[email protected]“ ist „location.action“ immer „PUSH“, selbst wenn auf die Schaltfläche „Zurück“ des Browsers geklickt wird
– Schleifenmodus
11. August 17 um 10:22 Uhr
@loopmode Wenn Sie die Aktion der Zurück-Schaltfläche handhaben, verwenden Sie so etwas wie browserHistory.goBack()??
– Jay Shin
12. August 17 um 11:28 Uhr
Ich habe festgestellt, dass sich an anderer Stelle ein Kollege manuell in den Verlauf einmischt, etwas in der Art von if (nextLocation.action === ‘POP’ && getStepIndex(nextLocation.pathname) === 0) { browserHistory.push({pathname: ${getPathForIndex(0)}}); falsch zurückgeben; } Also.. if POP then PUSH um den Weiterleiten-Button nicht verfügbar zu machen (der ohne das Absenden eines Formulars weitergehen würde) Also .. Ihre Antwort bleibt korrekt – Benutzerfehler auf meiner Seite 🙂
– Schleifenmodus
14. August 17 um 5:14 Uhr
Ab [email protected] können Sie nicht importieren browserHistory wie in dieser Antwort dargestellt. Anscheinend history ist enthalten in der props an jede Komponente übergeben, auf die von einer Route verwiesen wird. Fühlen Sie sich frei, mich zu korrigieren, wenn das nicht ganz richtig ist.
– Stopp
7. Juni 19 um 0:35 Uhr
Für jeden, der React Router 4+ verwendet, hat das Listen 2 Parameter, Ort und Aktion. history.listen((loc, action) => if (action === 'POP') // do stuff)
– Maulbrand
31. Januar 20 um 22:01 Uhr
Mithilfe von Haken können Sie die Zurück- und Vorwärtstasten erkennen
Was ist der _ (Unterstrich) in setLocationKeys(([ _, …keys ]) => Schlüssel)
– Schabbir Essaji
25. November 2020 um 10:30 Uhr
@ShabbirEssaji Es verwendet zerstören und der Spread-Operator, um ein Array zurückzugeben, bei dem das erste Element entfernt wurde. Dies kann helfen
– rob-gordon
25. November 20 um 18:50 Uhr
@ShabbirEssaji Sie haben Ihre Antwort wahrscheinlich schon gefunden, aber ein Unterstrich wird häufig verwendet, wenn eine Variable zugewiesen werden muss, aber nicht verwendet wird.
– Josh J
2. September 21 um 14:41 Uhr
Ist dies immer noch ein guter Weg, um sowohl vor als auch zurück zu handhaben, oder wurde etwas hinzugefügt, um mit dem wohl hackigen umzugehen? locationKeys, setLocationKeys bisschen? noch. bitte. ty
– Die Mutter von Joseph Beuys
27. September 21 um 13:38 Uhr
Bisher ja, das ist die beste Lösung, die wir haben.
Der “Reaktionsweg” ist zu restriktiv und byzantinisch.
– Peter Moore
22. August 21 um 14:23 Uhr
Bnaja
Hooks-Probe
const {history} = useRouter();
useEffect(() => {
return () => {
// && history.location.pathname === "any specific path")
if (history.action === "POP") {
history.replace(history.location.pathname, /* the new state */);
}
};
}, [history])
Ich verwende history.listen nicht, weil es den Status nicht beeinflusst
const disposeListener = history.listen(navData => {
if (navData.pathname === "/props") {
navData.state = /* the new state */;
}
});
Die meisten Antworten auf diese Frage verwenden entweder veraltete Versionen von React Router, verlassen sich auf weniger moderne Klassenkomponenten oder sind verwirrend; und keiner verwendet Typescript, was eine übliche Kombination ist. Hier ist eine Antwort mit Router v5, Funktionskomponenten und Typoskript:
// use destructuring to access the history property of the ReactComponentProps type
function MyComponent( { history }: ReactComponentProps) {
// use useEffect to access lifecycle methods, as componentDidMount etc. are not available on function components.
useEffect(() => {
return () => {
if (history.action === "POP") {
// Code here will run when back button fires. Note that it's after the `return` for useEffect's callback; code before the return will fire after the page mounts, code after when it is about to unmount.
}
}
})
}
Ein ausführlicheres Beispiel mit Erläuterungen finden Sie hier.
Version 3.x der React Router API hat eine Reihe von Dienstprogrammen Sie können verwenden, um ein “Zurück”-Schaltflächenereignis anzuzeigen, bevor das Ereignis im Verlauf des Browsers registriert wird. Sie müssen Ihre Komponente zuerst in die einschließen withRouter() Komponente höherer Ordnung. Sie können dann die verwenden setRouteLeaveHook() Funktion, die jede akzeptiert route Objekt mit einem gültigen path -Eigenschaft und eine Callback-Funktion.
import {Component} from 'react';
import {withRouter} from 'react-router';
class Foo extends Component {
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave);
}
routerWillLeave(nextState) { // return false to block navigation, true to allow
if (nextState.action === 'POP') {
// handle "Back" button clicks here
}
}
}
export default withRouter(Foo);
Irmantas Ramanauskas
Ich habe withrouter hoc verwendet, um eine History-Prop zu erhalten und einfach eine componentDidMount() -Methode zu schreiben:
componentDidMount() {
if (this.props.history.action === "POP") {
// custom back button implementation
}
}
Es wird ausgelöst, bevor Sie auf die Zurück-Schaltfläche klicken. Können Sie dabei helfen? Wir müssen ein benutzerdefiniertes Popup auslösen, nachdem Sie auf die Zurück-Schaltfläche geklickt haben.
– 151291
2. April 19 um 6:20 Uhr
.
5626700cookie-checkZurück-Button des Browsers im React-Router abfangen/behandeln?yes