解決vue中使用history.replaceState?更改url?vue?router?無(wú)法感知的問(wèn)題
vue中使用history.replaceState 更改url vue router 無(wú)法感知的問(wèn)題
描述
最近做一個(gè)需求,URL更新不刷新頁(yè)面,在網(wǎng)上找了 好多文章都說(shuō) router.replace
更新URL不會(huì)刷新頁(yè)面(前提是路由為 history
模式),我也用了,一開(kāi)始是沒(méi)問(wèn)題的,可以實(shí)現(xiàn)需求,但是后來(lái)URL變得越來(lái)越復(fù)雜,會(huì)導(dǎo)致URL更新時(shí),會(huì)觸發(fā)mounted
執(zhí)行,這樣的話(huà)頁(yè)面就會(huì)刷新,后來(lái)更換了 history.replaceState
API 更新URL,頁(yè)面確實(shí)不刷新了,但是也帶來(lái)了新的問(wèn)題,就是 vue router 無(wú)法感知到URL的變化 ,舉個(gè)例子吧
假設(shè)
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
這個(gè)結(jié)果是對(duì)的;
如果使用 history.replaceState
更新url就會(huì)出現(xiàn)問(wèn)題
使用 history.replaceState
更新 url history.replaceState(null,'','www.eg.com/index?a=2')
;url 確實(shí)是更新了,
輸出 fullpath console.log(this.$route.fullPath)
=> www.eg.com/index?a=1
結(jié)論: this.$route
就沒(méi)有被更新
如何修復(fù)這個(gè)問(wèn)題
// 這個(gè) stateObj 其實(shí)就是查詢(xún)參數(shù)的 key value 轉(zhuǎn)換成的對(duì)象 const stateObj = { a:2, b:3 } history.replaceState(stateObj, 'title', 'www.eg.com/index?a=2&b=3') // 將原來(lái)的 this.$route 克隆一份 const _route = Object.assign({},this.$route); // 更新 fullPath _route.fullPath = 'www.eg.com/index?a=2&b=3' // 更新 參數(shù) _route.params = stateObj // 調(diào)用 router.history 里的更新方法 cb 傳入最新的route就可以了 this.$router.history.cb(_route) // 我們?cè)俅屋敵?fullPath console.log(this.$route.fullPath) => 'www.eg.com/index?a=2&b=3'
問(wèn)題到這里就修復(fù)了
其實(shí) 使用 history api 更新 URL 這個(gè)功能 react router 早在 V3 版本就已經(jīng)實(shí)現(xiàn)了,話(huà)說(shuō)這已經(jīng)是 5 ,6 年前的問(wèn)題了, 也就是說(shuō) 使用 history api 更新url react router 是可以感知到 URL 變化的并且會(huì)被記錄,但是vue沒(méi)有,還好有router.history.cb
這個(gè)回掉,不然神仙都解決不了這個(gè)問(wèn)題。。。。
到此這篇關(guān)于vue中使用history.replaceState 更改url vue router 無(wú)法感知的問(wèn)題的文章就介紹到這了,更多相關(guān)vue url vue router內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在IDEA中Debug調(diào)試VUE項(xiàng)目的詳細(xì)步驟
idea竟然有一個(gè)神功能很多朋友都不是特別清楚,下面小編給大家?guī)?lái)了在IDEA中Debug調(diào)試VUE項(xiàng)目的詳細(xì)步驟,感興趣的朋友一起看看吧2021-10-10解決vue-router進(jìn)行build無(wú)法正常顯示路由頁(yè)面的問(wèn)題
下面小編就為大家分享一篇解決vue-router進(jìn)行build無(wú)法正常顯示路由頁(yè)面的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03解決獲取數(shù)據(jù)后this.$refs.xxx.toggleRowSelection無(wú)效的問(wèn)題
這篇文章主要介紹了解決獲取數(shù)據(jù)后this.$refs.xxx.toggleRowSelection無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue3+vite實(shí)現(xiàn)低版本瀏覽器兼容的解決方案(出現(xiàn)白屏問(wèn)題)
項(xiàng)目全線(xiàn)使用vue3的時(shí)候,自然使用的是配套更加契合的vite打包工具,于是自然而然會(huì)用到很多新的語(yǔ)法,本文給大家介紹了vue3+vite實(shí)現(xiàn)低版本瀏覽器兼容的解決方案(出現(xiàn)白屏問(wèn)題),需要的朋友可以參考下2024-04-04vue單頁(yè)面如何解決多個(gè)視頻同時(shí)僅能播放一個(gè)問(wèn)題
這篇文章主要介紹了vue單頁(yè)面如何解決多個(gè)視頻同時(shí)僅能播放一個(gè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03解決vue-cli-service不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件的報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了解決vue-cli-service不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件的報(bào)錯(cuò)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03vue2 如何實(shí)現(xiàn)div contenteditable=“true”(類(lèi)似于v-model)的效果
這篇文章主要給大家介紹了利用vue2如何實(shí)現(xiàn)div contenteditable="true",就是類(lèi)似于v-model的效果,文中給出了兩種解決的思路,對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-02-02Vue echarts模擬后端數(shù)據(jù)流程詳解
在平常的項(xiàng)目中,echarts圖表我們也是使用的非常多的,通常我們從后端拿到數(shù)據(jù),需要在圖表上動(dòng)態(tài)的進(jìn)行呈現(xiàn),接下來(lái)我們就模擬從后端獲取數(shù)據(jù)然后進(jìn)行呈現(xiàn)的方法2022-09-09