Non riesco a capire come mostrare un dialogo personalizzato invece di utilizzare il normale window.confirm
utilizzato da routeWillLeave
e history.listenBefore
. Fondamentalmente ho costruito un sistema di notifica e controllo se un modulo è sporco const { dispatch, history, dirty } = this.props;
Mostra finestra di dialogo personalizzata setRouteLeaveHook o history.listenPrima di reagire-router/redux?
se il modulo è sporco significa che l'utente ha modifiche non salvate. Se cambiano rotta, vorrei mostrare la mia notifica che avrà due pulsanti STAY
, IGNORE
che possono entrambi assumere un gestore onClick.
Ive ha trascorso un po 'di tempo su google e non ha trovato alcun riferimento a come avrei potuto ottenere ciò utilizzando routeWillLeave
. La cosa più vicina che ho trovato era usare history.listenBefore
tuttavia i documenti dicono che ho bisogno di farlo.
let history = createHistory({
getUserConfirmation(message, callback) {
callback(window.confirm(message)) // The default behavior
}
})
Ma io sto usando browserHistory da reagire-router di avviare il mio negozio const history = syncHistoryWithStore(browserHistory, store);
Come posso fermare un cambiamento percorso dopo un link è stato cliccato, mostrano una notifica utilizzando il mio sistema di notifica personalizzato e seconda su quale pulsante si fa clic su una transizione alla nuova rotta o si rimane?
Ecco un esempio di come funziona il mio sistema di notifica e la direzione in cui ovviamente non funziona perché tutto ciò che restituisce è una stringa da mostrare nel dialogo window.confirm per impostazione predefinita.
history.listenBefore((location) => {
if(this.props.dirty){
const acceptBtn = {
title: 'STAY',
handler: ignoreRouteChange() //This can be any function I want
}
const denyBtn = {
title: 'IGNORE',
handler: continueRouteChange() //This can be any function I want
}
return dispatch(addNotification({
message: 'You have unsaved changes!',
type: NOTIFICATION_TYPE_WARNING,
duration: 0,
canDismiss: false,
acceptBtn,
denyBtn
}));
return "Usaved changes!"
}
});
Grazie
ho solo risposto a una domanda simile qui: http://stackoverflow.com/a/35793421/52041 –
Grazie per questo, solo per curiosità come ti è venuta con questa soluzione? Hai approfondito come è stato implementato setRouterLeaveHook e lo hai implementato di nuovo per fornire una versione asynv o ..? – Deep
No, ho appena fatto un po 'di brainstorming con un collega, basato sul comportamento di setRouterLeaveHook. –