Zurück-Button des Browsers im React-Router abfangen/behandeln?

Lesezeit: 5 Minuten

Zuruck Button des Browsers im React Router abfangenbehandeln
hohe Inkompetenz

Ich verwende die Registerkarten von Material-ui, die gesteuert werden, und ich verwende sie für (React-Router) Links wie diese:

    <Tab value={0} label="dashboard" containerElement={<Link to="/dashboard/home"/>}/>
    <Tab value={1} label="users" containerElement={<Link to="/dashboard/users"/>} />
  <Tab value={2} label="data" containerElement={<Link to="/dashboard/data"/>} />

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)

1642687386 227 Zuruck Button des Browsers im React Router abfangenbehandeln
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

import { useHistory } from 'react-router-dom'


const [ locationKeys, setLocationKeys ] = useState([])
const history = useHistory()

useEffect(() => {
  return history.listen(location => {
    if (history.action === 'PUSH') {
      setLocationKeys([ location.key ])
    }

    if (history.action === 'POP') {
      if (locationKeys[1] === location.key) {
        setLocationKeys(([ _, ...keys ]) => keys)

        // Handle forward event

      } else {
        setLocationKeys((keys) => [ location.key, ...keys ])

        // Handle back event

      }
    }
  })
}, [ locationKeys, ])

  • 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.

    – Nicolas Keller

    29. September 21 um 8:31 Uhr

so habe ich es am Ende gemacht:

componentDidMount() {
    this._isMounted = true;
    window.onpopstate = ()=> {
      if(this._isMounted) {
        const { hash } = location;
        if(hash.indexOf('home')>-1 && this.state.value!==0)
          this.setState({value: 0})
        if(hash.indexOf('users')>-1 && this.state.value!==1)
          this.setState({value: 1})
        if(hash.indexOf('data')>-1 && this.state.value!==2)
          this.setState({value: 2})
      }
    }
  }

Danke an alle für die Hilfe lol

  • es ist kein Reaktionsweg

    – Atombit

    3. Oktober 19 um 13:49 Uhr

  • Der “Reaktionsweg” ist zu restriktiv und byzantinisch.

    – Peter Moore

    22. August 21 um 14:23 Uhr

Zuruck Button des Browsers im React Router abfangenbehandeln
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);

Zuruck Button des Browsers im React Router abfangenbehandeln
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


.

562670cookie-checkZurück-Button des Browsers im React-Router abfangen/behandeln?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy