In React-Router v2.4.0
o superiore e prima v4
ci sono diverse opzioni
- Aggiungi funzione
onLeave
perRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Usa la funzione
setRouteLeaveHook
percomponentDidMount
È possibile impedire che avvenga una transizione o avvisare l'utente prima di lasciare una rotta con un gancio di uscita.
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?'
},
// ...
})
)
Nota che questo esempio fa uso del withRouter
componente di ordine superiore introdotto inv2.4.0.
Tuttavia, queste soluzioni non funzionano perfettamente quando si modifica manualmente il percorso nell'URL
Nel senso che
- vediamo la Conferma - ok
- il contenuto della pagina non si ricarica - ok
- L'URL non cambia, non va bene
Per react-router v4
utilizzare Prompt o cronologia personalizzata:
Tuttavia react-router v4
, è piuttosto più facile da implementare con l'aiuto di Prompt
from'react-router
Secondo la documentazione
Richiesta
Utilizzato per chiedere all'utente prima di uscire da una pagina. Quando la tua applicazione entra in uno stato che dovrebbe impedire all'utente di allontanarsi (come un modulo è compilato a metà), esegui il rendering di un file <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
messaggio: stringa
Il messaggio con cui chiedere all'utente quando tenta di uscire.
<Prompt message="Are you sure you want to leave?"/>
messaggio: funz
Verrà chiamato con la posizione e l'azione successiva a cui l'utente sta tentando di navigare. Restituisce una stringa per mostrare un prompt all'utente o true per consentire la transizione.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
quando: bool
Invece di <Prompt>
eseguire il rendering condizionalmente di un dietro una guardia, puoi sempre renderlo ma passare when={true}
o when={false}
impedire o consentire la navigazione di conseguenza.
Nel tuo metodo di rendering devi semplicemente aggiungerlo come indicato nella documentazione in base alle tue necessità.
AGGIORNARE:
Nel caso in cui desideri avere un'azione personalizzata da intraprendere quando l'uso sta lasciando la pagina, puoi utilizzare la cronologia personalizzata e configurare il tuo router come
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
e poi nel tuo componente puoi usare history.block
like
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 } }
modo puoi chiamare la tua funzione di pubblicazione bevor lasciando la pagina