vue使用keep-alive保持滾動(dòng)條位置的實(shí)現(xiàn)方法
前言
下班前,20分鐘,發(fā)一篇。。。
簡(jiǎn)單介紹,使用keep-alive的時(shí)候,返回前一頁(yè),沒(méi)有保持滾動(dòng)條位置。
事實(shí)上,就算不使用keep-alive,位置也沒(méi)有被記錄。
但是,在不適用keep-alive的時(shí)候,頁(yè)面內(nèi)容會(huì)刷新,所以就隨他去了……就是這么任性……
思路
官方有推薦一個(gè)scrollBehavior,鏈接,但是上面標(biāo)注,只在history.pushState的瀏覽器生效,不知道是不是只能開(kāi)啟history.pushState才可以使用,看了下實(shí)現(xiàn),挺不友好的,還是自己搞一個(gè)吧。。。
實(shí)現(xiàn)思路是這樣的,首先給路由增加一個(gè)對(duì)象meta:
meta: {
keepAlive: true,
scrollTop: 0,
}
keepAlive是否需要保持頁(yè)面,scrollTop記錄頁(yè)面的滾動(dòng)位置。
然后在app.vue增加如下入口:
<keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view>
這樣就啟用keep-alive了。
然后在全局main.ts增加一個(gè)全局路由控制:
router.beforeEach((to: Route, from: Route, next: () => void) => {
if (from.meta.keepAlive) {
const $content = document.querySelector('#content');
const scrollTop = $content ? $content.scrollTop : 0;
from.meta.scrollTop = scrollTop;
}
next();
});
很簡(jiǎn)單,離開(kāi)的時(shí)候判斷當(dāng)前頁(yè)是否需要保持頁(yè)面,如果需要,記錄頁(yè)面主容器content的滾動(dòng)位置,寫(xiě)入路由。
然后,每次進(jìn)入保持好的頁(yè)面,讀取滾動(dòng)條位置scrollTop,修改主容器的scrollTop,就搞定了:
public activated() {
const scrollTop = this.$route.meta.scrollTop;
const $content = document.querySelector('#content');
if (scrollTop && $content) {
$content.scrollTop = scrollTop;
}
}
看起來(lái)很簡(jiǎn)單哦。
遺留問(wèn)題
1、是不是每個(gè)頁(yè)面都可以記錄滾動(dòng)條位置呢?
其實(shí)不是的,有的頁(yè)面,內(nèi)部有js交互,比如tab交互,不同的tab,頁(yè)面可滾動(dòng)的高度不一致,如果不保持頁(yè)面狀態(tài)而統(tǒng)一記錄滾動(dòng)位置,有可能導(dǎo)致滾動(dòng)條的位置錯(cuò)位。
2、能不能把a(bǔ)ctivated這一步寫(xiě)到全局的main.ts或者state去呢?
有想過(guò)這點(diǎn),但是目前來(lái)說(shuō),沒(méi)找到實(shí)現(xiàn)的方法。
首先,如果通過(guò)router來(lái)控制,做不到,全局路由控制只能在頁(yè)面加載前監(jiān)聽(tīng),取不到載入頁(yè)的元素。
如果寫(xiě)在一個(gè)通用的全局函數(shù)去控制,比如定義一個(gè)state,當(dāng)頁(yè)面加載完的時(shí)候設(shè)置,那需要定義一個(gè)mixins來(lái)處理,但是對(duì)這個(gè)mixins不太熟悉,暫時(shí)還不知道該怎么做,可能有時(shí)間找個(gè)方法搞定它。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue如何實(shí)現(xiàn)分批加載數(shù)據(jù)
這篇文章主要介紹了Vue如何實(shí)現(xiàn)分批加載數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue項(xiàng)目在運(yùn)行npm run build時(shí)卡住不動(dòng)問(wèn)題及解決方案
這篇文章主要介紹了vue項(xiàng)目在運(yùn)行npm run build時(shí)卡住不動(dòng)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Vite性能優(yōu)化之分包策略的實(shí)現(xiàn)
本文主要介紹了Vite性能優(yōu)化之分包策略的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
解決Vue.js應(yīng)用回退或刷新界面時(shí)提示用戶(hù)保存修改問(wèn)題
這篇文章主要介紹了Vue.js應(yīng)用回退或刷新界面時(shí)提示用戶(hù)保存修改問(wèn)題,本文通過(guò)兩種手段防止運(yùn)營(yíng)編輯時(shí)丟失數(shù)據(jù),具體內(nèi)容詳情,感興趣的朋友跟隨小編一起看看吧2019-11-11
vue中提示$index is not defined錯(cuò)誤的解決方式
這篇文章主要介紹了vue中提示$index is not defined錯(cuò)誤的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue做網(wǎng)頁(yè)開(kāi)場(chǎng)視頻的實(shí)例代碼
這篇文章主要介紹了vue做網(wǎng)頁(yè)開(kāi)場(chǎng)視頻的實(shí)例代碼,需要的朋友可以參考下2017-10-10
解讀element?el-upload上傳的附件名稱(chēng)不顯示?file-list賦值
這篇文章主要介紹了解讀element?el-upload上傳的附件名稱(chēng)不顯示?file-list賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
淺談Vue數(shù)據(jù)響應(yīng)思路之?dāng)?shù)組
這篇文章主要介紹了淺談Vue數(shù)據(jù)響應(yīng)思路之?dāng)?shù)組,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
vue的圖片需要用require的方式進(jìn)行引入問(wèn)題
這篇文章主要介紹了vue的圖片需要用require的方式進(jìn)行引入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

