W React-Router v2.4.0
lub wyżej i wcześniej v4
jest kilka opcji
- Dodaj funkcję
onLeave
dlaRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Użyj funkcji
setRouteLeaveHook
dlacomponentDidMount
Możesz zapobiec wystąpieniu przejścia lub monitować użytkownika przed opuszczeniem trasy za pomocą haka opuszczenia.
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?'
},
// ...
})
)
Należy zauważyć, że w tym przykładzie wykorzystano składnik withRouter
wyższego rzędu wprowadzony wv2.4.0.
Jednak to rozwiązanie nie działa idealnie przy ręcznej zmianie trasy w adresie URL
W tym sensie
- widzimy Potwierdzenie - ok
- zawartość strony nie ładuje się ponownie - ok
- URL się nie zmienia - nie w porządku
Aby react-router v4
użyć Monit lub historii niestandardowej:
Jednak react-router v4
jest to raczej łatwiejsze do wdrożenia przy pomocyPrompt
speak-router
Zgodnie z dokumentacją
Skłonić
Służy do monitowania użytkownika przed opuszczeniem strony. Gdy aplikacja wejdzie w stan, który powinien uniemożliwić użytkownikowi opuszczenie go (np. Formularz jest wypełniony do połowy), wyrenderuj plik <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
wiadomość: ciąg
Komunikat monitujący użytkownika, gdy próbuje opuścić stronę.
<Prompt message="Are you sure you want to leave?"/>
wiadomość: func
Zostanie wywołana z następną lokalizacją i czynnością, do której użytkownik próbuje przejść. Zwróć ciąg, aby wyświetlić monit dla użytkownika, lub true, aby zezwolić na przejście.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
kiedy: bool
Zamiast warunkowego renderowania znaku <Prompt>
za strażnikiem, zawsze możesz go wyrenderować, ale przejść when={true}
lub when={false}
odpowiednio uniemożliwić lub zezwolić na nawigację.
W swojej metodzie renderowania wystarczy dodać to, jak wspomniano w dokumentacji, zgodnie z potrzebami.
AKTUALIZACJA:
W przypadku, gdy chciałbyś mieć niestandardową akcję do wykonania, gdy używasz opuszczania strony, możesz skorzystać z niestandardowej historii i skonfigurować router jak
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
a następnie w swoim komponencie możesz wykorzystać history.block
podobne
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 } }
sposób, aby móc wywołać funkcję publikowania przed opuszczeniem strony