Vue keepAlive 數(shù)據(jù)緩存工具實(shí)現(xiàn)返回上一個(gè)頁(yè)面瀏覽的位置
需求分析
背景:
1.數(shù)據(jù)列表頁(yè),滾動(dòng)加載數(shù)據(jù);
2.多條數(shù)據(jù)情況下,點(diǎn)擊某一條,進(jìn)入詳細(xì)頁(yè)進(jìn)行編輯(修改,刪除)操作;
3.保存返回上一頁(yè);
在上面的情況下,想要保持在上次瀏覽位置,并且保持?jǐn)?shù)據(jù)是最新的;
解決辦法
1.原始的辦法:在點(diǎn)擊詳情頁(yè)的時(shí)候,記住瀏覽位置,傳遞參數(shù)或者存到本地緩存,然后在詳情頁(yè)操作完畢后,返回的時(shí)候,路由守衛(wèi)可以判斷,是否詳情頁(yè)跳轉(zhuǎn)回來(lái)的,然后讓頁(yè)面滾動(dòng)到上次記錄的位置;
思路是這樣,實(shí)際操作很麻煩;
2.推薦辦法:使用vue動(dòng)態(tài)組件keep-alive,搭配路由守衛(wèi)函數(shù)beforeRouteLeave,以及activated鉤子函數(shù);
對(duì)于鉤子函數(shù)執(zhí)行順序,以及作用詳細(xì)說(shuō)明,請(qǐng)參考vue組件的生命周期
步驟詳解
我的步驟是按照開(kāi)發(fā)思路進(jìn)行的,場(chǎng)景就是從商品列表頁(yè)——>商品詳細(xì)頁(yè)——>商品列表(數(shù)據(jù)緩存);
開(kāi)發(fā)之前看到網(wǎng)上好多人都是在路由文件里面配置
meta:{keepAlive:true}
但我覺(jué)得沒(méi)有必要,因?yàn)榱斜眄?yè)不是一直需要緩存數(shù)據(jù)的,假如從首頁(yè)進(jìn)入,則不需要,所以就在路由守衛(wèi)函數(shù)中判斷是否需要緩存數(shù)據(jù)即可;
以下代碼,使用list.vue代表列表頁(yè);detail.vue代表詳細(xì)頁(yè);
場(chǎng)景1:點(diǎn)擊返回,判斷路由跳轉(zhuǎn)的是否是需要緩存的列表頁(yè):
detail.vue
beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard') { to.meta.keepAlive = true } next() }
由于keepAlive是vue2.0中內(nèi)置組件,所以設(shè)置頁(yè)面路由meta.keepAlive = true
即可緩存數(shù)據(jù),路由跳轉(zhuǎn)是利用函數(shù)this.$router.go(-1);
就可以顯示在上次瀏覽的記錄位置;
場(chǎng)景2:編輯詳細(xì)頁(yè)數(shù)據(jù),回到列表頁(yè),則需要將修改的數(shù)據(jù)保存到本地,然后在列表頁(yè)的緩存數(shù)據(jù)中,更改顯示即可:
detail.vue
beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard') { to.meta.keepAlive = true } if (this.isChange) { let changeData = { inquiryNo: this.inquiry.inquiryNo, inquiryTitle: this.inquiry.inquiryTitle } window.sessionStorage.setItem('changeData', JSON.stringify(changeData)) } to.meta.isChange = this.isChange next() }
列表頁(yè)中判斷一下,是否需要修改數(shù)據(jù):
list.vue
activated () { if (this.$route.meta.isChange) { let changeData = JSON.parse(window.sessionStorage.getItem('changeData')) this.list.forEach(item => { if (item.inquiryNo === changeData.inquiryNo) { item.inquiryTitle = changeData.inquiryTitle } }) } }
activated 鉤子函數(shù),在keep-alive組件激活時(shí)自動(dòng)執(zhí)行,判斷如果需要修改,從本地取出數(shù)據(jù),循環(huán)列表數(shù)據(jù),找出需要修改的那一條,進(jìn)行顯示數(shù)據(jù)的修改(因?yàn)槭桥R時(shí)修改,所以只修改顯示的參數(shù)即可);
場(chǎng)景3:在詳細(xì)頁(yè)點(diǎn)擊刪除該條數(shù)據(jù)
detail.vue
beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard' && !this.idDel) { to.meta.keepAlive = true } next() }
刪除操作,可以排除后直接不用緩存,或者跟修改一樣的操作,判斷是刪除,臨時(shí)刪除,列表中緩存的數(shù)據(jù)也可以;
上面3種情況通常會(huì)同時(shí)出現(xiàn),所以最后的寫(xiě)法就是:
detail.vue
beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard' && !this.idDel) { to.meta.keepAlive = true } if (this.isChange) { let changeData = { inquiryNo: this.inquiry.inquiryNo, inquiryTitle: this.inquiry.inquiryTitle } window.sessionStorage.setItem('changeData', JSON.stringify(changeData)) } to.meta.isChange = this.isChange next() }
list.vue
beforeRouteLeave (to, from, next) { from.meta.keepAlive = false next() }, activated () { if (this.$route.meta.isChange) { let changeData = JSON.parse(window.sessionStorage.getItem('changeData')) this.list.forEach(item => { if (item.inquiryNo === changeData.inquiryNo) { item.inquiryTitle = changeData.inquiryTitle } }) } }
列表頁(yè)種路由跳轉(zhuǎn)的時(shí)候需要進(jìn)行meta.keepAlive = false操作,防止出現(xiàn),從detail.vue跳轉(zhuǎn)回來(lái)后,list.vue在與其他頁(yè)面進(jìn)行路由跳轉(zhuǎn)的時(shí)候,始終處于緩存狀態(tài),數(shù)據(jù)不更新現(xiàn)象;
注意:在info.vue跳轉(zhuǎn)list.vue的路由活動(dòng)最好使用this.$router.go(-1)
,不然回到list.vue頁(yè)面,數(shù)據(jù)緩存了,但是頁(yè)面位置不會(huì)是上次訪問(wèn)的位置;具體原因還在研究,哈哈哈...
ok,上面就是在項(xiàng)目開(kāi)發(fā)使用中用到的keep-alive的整個(gè)思路;記錄一下,以免忘記,還有歡迎參考與指正。
以上所述是小編給大家介紹的Vue keepAlive 數(shù)據(jù)緩存工具實(shí)現(xiàn)返回上一個(gè)頁(yè)面瀏覽的位置,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
vue3+el-select實(shí)現(xiàn)觸底加載更多功能(ts版)
這篇文章主要給大家介紹了基于vue3和el-select實(shí)現(xiàn)觸底加載更多功能,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以借鑒參考下2023-07-07一次Vue中computed沒(méi)有觸發(fā)的原因以及排查經(jīng)歷
這篇文章主要介紹了一次Vue中computed沒(méi)有觸發(fā)的原因以及排查經(jīng)歷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11vue踩坑之在input中使用filters局部過(guò)濾器問(wèn)題
這篇文章主要介紹了vue踩坑之在input中使用filters局部過(guò)濾器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11vue使用富文本編輯器vue-quill-editor的操作指南和注意事項(xiàng)
vue中很多項(xiàng)目都需要用到富文本編輯器,在使用了ueditor和tinymce后,發(fā)現(xiàn)并不理想,所以果斷使用vue-quill-editor來(lái)實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于vue使用富文本編輯器vue-quill-editor的操作指南和注意事項(xiàng),需要的朋友可以參考下2023-05-05深入了解vue中一鍵復(fù)制功能的實(shí)現(xiàn)
在現(xiàn)代的Web應(yīng)用中,用戶體驗(yàn)至關(guān)重要,而提供簡(jiǎn)單易用的復(fù)制功能是改善用戶體驗(yàn)的一項(xiàng)關(guān)鍵功能,本文將為大家詳細(xì)介紹Vue實(shí)現(xiàn)一鍵復(fù)制功能的具體方法,需要的可以參考下2023-11-11