解決vue中使用history.replaceState?更改url?vue?router?無法感知的問題
vue中使用history.replaceState 更改url vue router 無法感知的問題
描述
最近做一個需求,URL更新不刷新頁面,在網上找了 好多文章都說 router.replace
更新URL不會刷新頁面(前提是路由為 history
模式),我也用了,一開始是沒問題的,可以實現需求,但是后來URL變得越來越復雜,會導致URL更新時,會觸發(fā)mounted
執(zhí)行,這樣的話頁面就會刷新,后來更換了 history.replaceState
API 更新URL,頁面確實不刷新了,但是也帶來了新的問題,就是 vue router 無法感知到URL的變化 ,舉個例子吧
假設
url:www.eg.com/index?a=1
使用router.replace
更新 url this.$router.replace('www.eg.com/index?a=2')
輸出 fullpath console.log(this.$route.fullPath)
=> www.eg.com/index?a=2
這個結果是對的;
如果使用 history.replaceState
更新url就會出現問題
使用 history.replaceState
更新 url history.replaceState(null,'','www.eg.com/index?a=2')
;url 確實是更新了,
輸出 fullpath console.log(this.$route.fullPath)
=> www.eg.com/index?a=1
結論: this.$route
就沒有被更新
如何修復這個問題
// 這個 stateObj 其實就是查詢參數的 key value 轉換成的對象 const stateObj = { a:2, b:3 } history.replaceState(stateObj, 'title', 'www.eg.com/index?a=2&b=3') // 將原來的 this.$route 克隆一份 const _route = Object.assign({},this.$route); // 更新 fullPath _route.fullPath = 'www.eg.com/index?a=2&b=3' // 更新 參數 _route.params = stateObj // 調用 router.history 里的更新方法 cb 傳入最新的route就可以了 this.$router.history.cb(_route) // 我們再次輸出 fullPath console.log(this.$route.fullPath) => 'www.eg.com/index?a=2&b=3'
問題到這里就修復了
其實 使用 history api 更新 URL 這個功能 react router 早在 V3 版本就已經實現了,話說這已經是 5 ,6 年前的問題了, 也就是說 使用 history api 更新url react router 是可以感知到 URL 變化的并且會被記錄,但是vue沒有,還好有router.history.cb
這個回掉,不然神仙都解決不了這個問題。。。。
到此這篇關于vue中使用history.replaceState 更改url vue router 無法感知的問題的文章就介紹到這了,更多相關vue url vue router內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決vue-router進行build無法正常顯示路由頁面的問題
下面小編就為大家分享一篇解決vue-router進行build無法正常顯示路由頁面的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03解決獲取數據后this.$refs.xxx.toggleRowSelection無效的問題
這篇文章主要介紹了解決獲取數據后this.$refs.xxx.toggleRowSelection無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10vue3+vite實現低版本瀏覽器兼容的解決方案(出現白屏問題)
項目全線使用vue3的時候,自然使用的是配套更加契合的vite打包工具,于是自然而然會用到很多新的語法,本文給大家介紹了vue3+vite實現低版本瀏覽器兼容的解決方案(出現白屏問題),需要的朋友可以參考下2024-04-04解決vue-cli-service不是內部或外部命令也不是可運行的程序或批處理文件的報錯問題
這篇文章主要介紹了解決vue-cli-service不是內部或外部命令也不是可運行的程序或批處理文件的報錯問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03vue2 如何實現div contenteditable=“true”(類似于v-model)的效果
這篇文章主要給大家介紹了利用vue2如何實現div contenteditable="true",就是類似于v-model的效果,文中給出了兩種解決的思路,對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。2017-02-02