記住組件滾動狀態:
使用場景:從某列表組件進入詳情頁,在返回的時候需要保留列表組件狀態,包括滾動的高度。這個時候需要keep-alive配合。
方法一:如下情況導航在做普遍用法。前提是使用keep-alive
keep-alive提供了兩個鈎子函數:
1. acvitaved: keep-alive 組件激活時調用。
2. deactivated: keep-alive 組件停用時調用。
用法: 先找到組件的最外層滾動的標簽的class或id。
export default { name: "docMng", //為了保存這個路由狀態
data() { return { offsetTop: "" //獲取滾動位置,下次進來的時候,設置滾動高度為這個值
}; }, activated() {
// keep-alive組件 頁面進入的時候設置滾動高度 document.getElementById("mainContent").scrollTop = this.offsetTop; }, deactivated() { //keep-alive 組件停用時調用(簡單理解為組件離開的時候)。 // 獲取頁面滾動高度,這個鈎子有可能會拿不到數據,因為這個鈎子執行的慢,可以用beforeRouteLeave代替
this.offsetTop = document.getElementById("mainContent").scrollTop;
},
// beforeRouteLeave(to, from, next) {
// // 組件離開的時候,獲取頁面滾動高度
// // this.offsetTop = document.getElementById('mainContent').scrollTop;
// next()
// },
};
方法二:項目全局頁面滾動的情況,導航菜單在頂部的時候可以用此方法。(不必keep-alive也可以)
配合vue-router的scrollBehavior。直接在scrollBehavior里面設置滾動到某一位置是設置不上的,只能異步再加個定時。
savePosition輸出的是{x:0,y:0}滾動的距離。
總結:
方法一 優點:由於keep-alive,所以到指定滾動高度的時候是無感知的。 缺點:需要對每個想要此功能的組件寫相應代碼。
方法二 優點:全局控制代碼量少。 缺點:需要加定時才能,延時返回指定高度,顯得突兀不流暢。
兩種方法的采用完全看自己項目的設計排版,所以某一方法有時候是可以通用的。