在作項目的時候,有個需求,當表單頁面未保存,切到其餘頁面時須要用戶確認跳轉。react
按常理來講,跳轉是由react-router-dom
控制的,因此它也應該有阻止跳轉的機制,查了api,發現Prompt
這個組件能夠作到這個事。將Prompt
放在須要彈窗的頁面裏,哪裏都行,就能夠有這個功能。api
<Prompt message={() => isSave ? true : '有修改還沒有保存,肯定要離開頁面嗎?’} />
Prompt
接受兩個屬性,message
能夠是字符串或方法,方法返回true
就順利跳轉,返回字符串就彈窗阻止跳轉。還有個屬性when
,是boolean
值,true
就是彈窗,false
爲順利跳轉。瀏覽器
但如今的彈窗是瀏覽器的默認彈窗,很醜。因此咱們須要自定義一下。antd
在react-router-dom
的BrowserRouter
和HashRouter
上有屬性getUserConfirmation
能夠阻止默認彈窗。react-router
<BrowserRouter getUserConfirmation={getConfirmation} > <App /> </BrowserRouter>
這個屬性是一個方法,參數爲Prompt
的message
和彈窗取消和確認的回調。這裏我直接用的antd的modal組件做爲彈窗。dom
const getConfirmation = (message: any, callback: any) => { Modal.confirm({ title: message, onCancel: () => { callback(false); }, onOk: () => { callback(true); } }); };
最後,在過程當中踩了一個坑。就是不能用router
組件。若是你像這樣code
<BrowserRouter getUserConfirmation={getConfirmation} > <Router history={history}> <App /> </Router> </BrowserRouter>
那麼getUserConfirmation
是不會起做用的。router