Im React-Router v2.4.0
oder höher und davor v4
gibt es mehrere Möglichkeiten
- Funktion hinzufügen
onLeave
fürRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Verwenden Sie die Funktion
setRouteLeaveHook
fürcomponentDidMount
Sie können verhindern, dass ein Übergang stattfindet, oder den Benutzer auffordern, bevor Sie eine Route mit einem Leave-Hook verlassen.
const Home = withRouter(
React.createClass({
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave)
},
routerWillLeave(nextLocation) {
// return false to prevent a transition w/o prompting the user,
// or return a string to allow the user to decide:
// return `null` or nothing to let other hooks to be executed
//
// NOTE: if you return true, other hooks will not be executed!
if (!this.state.isSaved)
return 'Your work is not saved! Are you sure you want to leave?'
},
// ...
})
)
Beachten Sie, dass in diesem Beispiel die withRouter
in eingeführte Komponente höherer Ordnung verwendet wirdv2.4.0.
Diese Lösung funktioniert jedoch nicht ganz perfekt, wenn die Route in der URL manuell geändert wird
In dem Sinne, dass
- wir sehen die Bestätigung - ok
- Seite enthalten wird nicht neu geladen - ok
- URL ändert sich nicht - nicht in Ordnung
So react-router v4
verwenden Sie die Eingabeaufforderung oder den benutzerdefinierten Verlauf:
In react-router v4
ist es jedoch mit Hilfe des Prompt
from'react-Routers einfacher zu implementieren
Laut Dokumentation
Prompt
Wird verwendet, um den Benutzer aufzufordern, bevor er von einer Seite weg navigiert. Wenn Ihre Anwendung in einen Zustand wechselt, der den Benutzer daran hindern soll, weg zu navigieren (wie wenn ein Formular zur Hälfte ausgefüllt ist), rendern Sie a <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
Nachricht: Zeichenfolge
Die Nachricht, die den Benutzer auffordert, wenn er versucht, weg zu navigieren.
<Prompt message="Are you sure you want to leave?"/>
Nachricht: func
Wird mit dem nächsten Ort und der nächsten Aktion aufgerufen, zu der der Benutzer navigieren möchte. Geben Sie eine Zeichenfolge zurück, um dem Benutzer eine Eingabeaufforderung anzuzeigen, oder true, um den Übergang zuzulassen.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
wann: bool
Stattdessen bedingt von einem Rendering <Prompt>
hinter einer Wache, können Sie es jederzeit machen , aber passieren when={true}
oder when={false}
zur Navigation entsprechend zu verhindern oder zu ermöglichen.
In Ihrer Rendermethode müssen Sie dies einfach wie in der Dokumentation angegeben entsprechend Ihren Anforderungen hinzufügen.
AKTUALISIEREN:
Wenn Sie eine benutzerdefinierte Aktion ausführen möchten, wenn die Verwendung die Seite verlässt, können Sie den benutzerdefinierten Verlauf verwenden und Ihren Router wie folgt konfigurieren
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
und dann können Sie in Ihrer Komponente history.block
like verwenden
import { history } from 'path/to/history';
class MyComponent extends React.Component {
componentDidMount() {
this.unblock = history.block(targetLocation => {
// take your action here
return false;
});
}
componentWillUnmount() {
this.unblock();
}
render() {
//component render here
}
}
componentWillUnmount() { if (confirm('Changes are saved, but not published yet. Do that now?')) { // publish and go away from a specific page } else { // do nothing and go away from a specific page } }
so können Sie Ihre Funktion aufrufen veröffentlichen Bevor die Seite verlassen