詳解使用Vue Router導(dǎo)航鉤子與Vuex來(lái)實(shí)現(xiàn)后退狀態(tài)保存
不好意思,標(biāo)題比較啰嗦,因?yàn)檫@次的流水賬確實(shí)屬于一個(gè)比較細(xì)節(jié)的小東西,下面詳細(xì)講:
1需求
最近在使用electron-vue 開(kāi)發(fā)一個(gè)跨平臺(tái)的桌面端軟件,剛上手寫(xiě)了幾個(gè)頁(yè)面,遇到一個(gè)問(wèn)題:桌面端軟件通常會(huì)有導(dǎo)航需求,類似下圖

導(dǎo)航按鈕
點(diǎn)擊返回按鈕,返回上一頁(yè),并且顯示上頁(yè)內(nèi)容。其實(shí)不止App,即使普通的網(wǎng)頁(yè)中也會(huì)有此類需求,尤其是使用vue寫(xiě)SPA時(shí)。
項(xiàng)目中的導(dǎo)航幾乎都是采用router.push({name: 'xxx', params: {xxx:123...}})這種方式。這種方式導(dǎo)致的一個(gè)直接問(wèn)題是:當(dāng)點(diǎn)擊后退按鈕(調(diào)用 router.go(-1))時(shí),history中只保存了URL而丟失了params對(duì)象,進(jìn)而導(dǎo)致依賴params的頁(yè)面渲染異常。
2 解決
其實(shí)思路很簡(jiǎn)單,既然是在后退操作中丟失了params,那么我們自然會(huì)想到:如何保存一下params!沒(méi)錯(cuò),就是這么粗暴,你既然要丟,我就把你保存一下!
怎么存: 其實(shí)想都不用想這是一個(gè)跨組件通信問(wèn)題拉,所以很自然的,用Vuex保存是最合乎常理的咯!
什么時(shí)候存:第一反應(yīng),調(diào)用 router.push({name: 'xxx', params: {xxx:123...}})時(shí)保存,然后如果導(dǎo)航回到這個(gè)URL,如果沒(méi)有params,嘗試從vuex store里取。似乎沒(méi)錯(cuò),就是麻煩了點(diǎn)兒??!別慌,咱們有導(dǎo)航鉤子 router.beforeEach((to, from, next) => { // ... }) ??!
正如其名,vue-router 提供的導(dǎo)航鉤子主要用來(lái)攔截導(dǎo)航,讓它完成跳轉(zhuǎn)或取消。
說(shuō)到這兒,你應(yīng)該完全明白我的解決思路了,那下面廢話就不多說(shuō)了,上代碼:
/*
Vuex store 定義存儲(chǔ)對(duì)象RouterParams
*/
//...
const state = {
//定義一個(gè)存儲(chǔ)map,key:導(dǎo)航name,value:導(dǎo)航params
paramMap: {}
}
const mutations = {
REFRESHPARAM (state, paramKV) {
//mutation,應(yīng)該能看懂做的操作吧?
Vue.set(state.paramMap, paramKV.key, paramKV.value)
}
}
//...
/*
router中設(shè)置一個(gè)全局導(dǎo)航鉤子
*/
const router = new VueRouter({ ... }) //router
router.beforeEach((to, from, next) => {
// 只有在找不到params時(shí)才"出此下策"
if (Object.keys(to.params).length === 0) {
// 從store中取出付給params,此處注意路徑未必完全吻合,以你的為準(zhǔn)
Object.assign(to.params, store.state.RouterParams.paramMap[to.name] || {})
}
// 存儲(chǔ)一下params備用
store.commit('REFRESHPARAM', {key: to.name, value: to.params})
next() // 千萬(wàn)不要忘了,否則導(dǎo)航會(huì)被“掐死”在這兒。:-D
})
//...
很簡(jiǎn)單吧!總共沒(méi)有幾行代碼 O(∩_∩)O~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue-router結(jié)合vuex實(shí)現(xiàn)用戶權(quán)限控制功能
- vue router+vuex實(shí)現(xiàn)首頁(yè)登錄驗(yàn)證判斷邏輯
- 基于vue,vue-router, vuex及addRoutes進(jìn)行權(quán)限控制問(wèn)題
- 基于Vue、Vuex、Vue-router實(shí)現(xiàn)的購(gòu)物商城(原生切換動(dòng)畫(huà))效果
- vue-router+vuex addRoutes實(shí)現(xiàn)路由動(dòng)態(tài)加載及菜單動(dòng)態(tài)加載
- Vue-router 類似Vuex實(shí)現(xiàn)組件化開(kāi)發(fā)的示例
- Vuex與Vue router的使用詳細(xì)講解
相關(guān)文章
使用vue-router與v-if實(shí)現(xiàn)tab切換遇到的問(wèn)題及解決方法
這篇文章主要介紹了vue-router與v-if實(shí)現(xiàn)tab切換的思考,需要的朋友可以參考下2018-09-09
Vue循環(huán)組件加validate多表單驗(yàn)證的實(shí)例
今天小編就為大家分享一篇Vue循環(huán)組件加validate多表單驗(yàn)證的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
關(guān)于vue打包時(shí)的publicPath就是打包后靜態(tài)資源的路徑問(wèn)題
這篇文章主要介紹了vue打包時(shí)的publicPath,就是打包后靜態(tài)資源的路徑,本文通過(guò)三種情況分析給大家詳細(xì)介紹,需要的朋友可以參考下2022-07-07
Vite打包時(shí)去除console的方法實(shí)現(xiàn)
Vite打包項(xiàng)目時(shí),需要去除開(kāi)發(fā)時(shí)加入的console、debugger調(diào)試信息,本文主要介紹了Vite打包時(shí)去除console的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
Vue首屏加載過(guò)慢出現(xiàn)白屏的6種優(yōu)化方案匯總
vue項(xiàng)目打包上線后,首次打開(kāi)會(huì)發(fā)現(xiàn)加載很慢,出現(xiàn)白屏的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Vue首屏加載過(guò)慢出現(xiàn)白屏的6種優(yōu)化方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
vue3中ts語(yǔ)法使用element plus分頁(yè)組件警告錯(cuò)誤問(wèn)題
這篇文章主要介紹了vue3中ts語(yǔ)法使用element plus分頁(yè)組件警告錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue-cli3自動(dòng)消除console.log()的調(diào)試信息方式
這篇文章主要介紹了vue-cli3自動(dòng)消除console.log()的調(diào)試信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
vue中如何給el-table-column添加指定列的點(diǎn)擊事件
elementui中提供了點(diǎn)擊行處理事件,下面這篇文章主要給大家介紹了關(guān)于vue中如何給el-table-column添加指定列的點(diǎn)擊事件,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
Vue項(xiàng)目中使用jsonp抓取跨域數(shù)據(jù)的方法
這篇文章主要介紹了Vue項(xiàng)目中使用jsonp抓取跨域數(shù)據(jù)的方法,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2019-11-11
vue項(xiàng)目使用高德地圖時(shí)報(bào)錯(cuò):AMap?is?not?defined解決辦法
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目使用高德地圖時(shí)報(bào)錯(cuò):AMap?is?not?defined的解決辦法,"AMap is not defined"是一個(gè)錯(cuò)誤提示,意思是在代碼中沒(méi)有找到定義的AMap,需要的朋友可以參考下2023-12-12

