En react-router v2.4.0
o superior y antes v4
hay varias opciones
- Agregar función
onLeave
paraRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Usar función
setRouteLeaveHook
paracomponentDidMount
Puede evitar que se produzca una transición o avisar al usuario antes de abandonar una ruta con un gancho de salida.
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?'
},
// ...
})
)
Tenga en cuenta que este ejemplo hace uso del withRouter
componente de orden superior introducido env2.4.0.
Sin embargo, esta solución no funciona a la perfección cuando se cambia la ruta en la URL manualmente
En el sentido de que
- vemos la Confirmación - ok
- el contenido de la página no se recarga - ok
- La URL no cambia, no está bien
Para react-router v4
usar el historial personalizado o Prompt:
Sin embargo react-router v4
, es bastante más fácil de implementar con la ayuda de Prompt
from'react-router
Según la documentación
Rápido
Se utiliza para avisar al usuario antes de salir de una página. Cuando su aplicación entra en un estado que debería evitar que el usuario navegue (como si un formulario estuviera medio lleno), renderice un archivo <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
mensaje: cadena
El mensaje para avisar al usuario cuando intenta salir.
<Prompt message="Are you sure you want to leave?"/>
mensaje: func
Se llamará con la siguiente ubicación y acción a la que el usuario está intentando navegar. Devuelve una cadena para mostrar un mensaje al usuario o true para permitir la transición.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
cuando: bool
En lugar de renderizar condicionalmente un <Prompt>
detrás de un guardia, siempre puede renderizarlo pero pasar when={true}
o when={false}
para prevenir o permitir la navegación en consecuencia.
En su método de renderizado, simplemente necesita agregar esto como se menciona en la documentación de acuerdo con sus necesidades.
ACTUALIZAR:
En caso de que desee tener una acción personalizada para realizar cuando el uso está saliendo de la página, puede hacer uso del historial personalizado y configurar su enrutador como
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
y luego en su componente puede hacer uso de 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 } }
para que pueda llamar a su función de publicación antes de salir de la página