關於setRouteLeaveHook無法使用時的替代方案registerTransitionHook
背景:首先說明下,這個問題很奇怪,花了整整一天在google上搜了一圈沒有結果,深夜加班到10:30還是沒有效果。但是進度在一點點往前走,並且確認解題大方向沒有問題所以也一直沒有放棄。下面介紹下具體問題:
鉤子:我們知道reactRouter中有一個路由鉤子,這個鉤子可以針對某個元件(父或子)在遇到具體事件時觸發回撥,相當於攔截事件觸發做內建於鉤子hook中的方法。
需求:切換路由時觸發鉤子進行使用者提示是否離開目前路由
方案(google):
componentDidMount(){
this.props.router.setRouteLeaveHook(
this.props.route,
this.routerWillLeave
)
}
routerWillLeave(nextLoac) {
return "you sure you want to leave?" ;
}
另外需要注意的是:router的注入,withRouter對router的組裝之類的,這個google上都有,這裡只說我遇到的問題,目前為止在google上還沒有被發現
一通操作猛如虎,一看結果驚呆了,始終沒有效果,打了console一直沒法進入鉤子函式routerWillLeave,經過不斷嘗試之後發現一個問題:在不重新整理的情況下改變本js任何程式碼哪怕多一個或少一個空格然後編譯,效果就出來了。一直不太明白到底什麼原因,如果有看到的大神麻煩解釋下,謝謝。
後來在一次意外中發現router裡面還有個registerTransitionHook,之所以注意到這個是因為在debug上面程式碼時發現出效果的情況會進入到一個叫transitionHook的方法,所以我想如果不用setRouteLeaveHook直接使用registerTransitionHook是不是會達到同樣的效果,因為我用的是antd-react-dva一套,而router已經被dva封裝了一層,擔心之所以setRouteLeaveHook沒有是因為這個原因,所以就在google registerTransitionHook。一搜一個準,https://github.com/ReactTraining/history/issues/14這個大神說他就是用這個來實現我想要的效果的,但是人家是用history,dva裡面history從哪來?直接從父元件傳遞下來應該就可以了,但是因為router裡面就有這個方法,何必使用history,果斷把history改為this.props.router測試一把,搞定。
效果是有了,另外把google大神其他的助攻隨便說下吧,避免你們再找來找去了。此處會有一個小bug,你切換任何一個路由都會有彈框,怎麼辦?在componentWillUnmount裡面使用unregisterTransitionHook方法把鉤子撤銷掉,但是需要注意:必須是同一個鉤子,怎麼做?在constructor裡面繫結就好
constructor(props) {
super(props);
this.routerWillLeave = this.routerWillLeave.bind(this)
}
//離開該頁面時刪除該監聽事件
componentWillUnmount() {
this.props.router.unregisterTransitionHook(this.routerWillLeave)
}
因為太激動了,所以寫下這邊博文以作紀念,哈哈
相關文章
- 關於 top 工具的 6 個替代方案
- 關於Qt無法直接使用cout和cin的問題QT
- 關於SYS使用者無法使用延遲段建立的示例
- WinXP啟動無法顯示桌面,無法啟動IE,無法關機的解決方案
- 關於MySQL使用的時長MySql
- Spring使用Quartz定時排程Job無法Autowired注入Service的解決方案Springquartz
- 關於使用多表做update的語法
- 關於浮動會錯亂的問題——轉換思維尋找替代方案
- UiBot無法抓取Chrome元素和資料抓取工具無法使用的解決方案UIChrome
- 關於網路重置後無法聯網的解決辦法
- 關於dbconsole無法啟動的解決辦法
- docker ubuntu 的vi,nano命令無法使用的解決方案DockerUbuntuNaN
- 關於 VMware Workstation14 Pro 宿主機無法聯網問題解決方案
- 關於listener無法啟動的問題解決
- 記一次關於 timestamp 無法檢索時分秒的排坑記錄
- 關於requests的session方法無法保持cookie的問題。SessionCookie
- 關於linux使用寶塔皮膚安裝mysql無法使用navicat連線的問題LinuxMySql
- 關於無法用 https 登入 SAP ABAP Netweaver 系統的問題和解決方案HTTP
- 求救!使用eclipse時無法run on serverEclipseServer
- 關於vs.net無法進行除錯的處理辦法除錯
- 關於weget “無法建立SSL連線”的解決方法
- 關於VS報無法解析外部符號的錯誤符號
- 關於 Google 電子表格無法訪問的問題Go
- [譯] JSX 的替代方案JS
- 用於持續整合的13種Jenkins替代方案 -DEVJenkinsdev
- 關於wake on lan遠端喚醒主機的問題,長時間關機無法遠端喚醒
- 關於策略組編輯器無法開啟
- 關於無法建立aps.web專案的解決辦法 (轉)Web
- locust 工具 1.0.1 locust.queue.get () 方法無法使用,新文件也沒有找到替代辦法
- Windows 2000 無法直接關機解決方案 (轉)Windows
- 使用 localhost 無法連線 MySQL 資料庫的解決方案localhostMySql資料庫
- 關於E: 無法獲得鎖 /var/lib/dpkg/lock-frontend - open (11: 資源暫時不可用) 問題的解決方案。
- [BUG反饋]關於後臺無法釋出文章的BUG
- 關於android 使用bitmap的OOM心得和解決方案AndroidOOM
- 關於Win7系統,縮圖無法顯示的解決辦法Win7
- 無法替代 解析電視和顯示器的幾大區別
- shutdown immediate 持久無法關閉資料庫之解決方案資料庫
- Android開發中用於替代Enum的@IntDef的使用Android