vue 詳情頁返回列表頁面時保持列表的位置狀態不變


方法一:

1.在router.js里面(即路由文件中),此時模式為 history

const router = new VueRouter({
mode: 'history',
routes,
scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
if (from.meta.keepAlive) {
from.meta.savedPosition = document.body.scrollTop
}
return { x: 0, y: to.meta.savedPosition || 0 }
}
}
})
2.在router.js里面需要記錄位置的單頁面里面
let routes = [
{
path: '/',
name: 'home',
component: home,
meta: {
title: 'home',
keepAlive: true
}
}
3.App.vue里面<div id="app">  這樣寫的意義就是不緩存所有頁面,哪個地方寫了 keepAlive:true,哪個地方就記錄位置(加緩存)
<keep-alive >
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
4.位置確實記錄上了(加緩存,返回不刷新頁面),弊端就是返回不觸發created,所以有些頁面需要返回觸發的東西都寫在activated里面。

方法二:

beforeRouteLeave(to, from, next){
let position = window.scrollY()
this.$store.commit('SAVE_POSITION', position) //離開路由時把位置存起來
next()
}
在頁面中取值

updated () {
this.$nextTick(function(){
let position = this.$store.state.position //返回頁面取出來
window.scroll(0, position)
})
}
用updated 或者 beforeUpdate 鈎子都可以 代碼都寫在要保存滑動距離的界面
方法三:用默認的hash模式的

一個list頁點擊進入detail頁,我在這時記錄下list頁滾動條的位置,然后在detail頁返回到list頁時設置滾動條位置為剛才保存那個值。


// list頁route中的data鈎子
route : {
data : function () {
var _this = this;
// 返回同一個位置
var scrollTop = sessionStorage.getItem("scrollTop");
if (scrollTop) {
_this.$nextTick(function () {
$(".abuild-record-layout").scrollTop(scrollTop);
});
}
}
}
$nextTick將回調延遲到下次 DOM 更新循環之后執行。在修改數據之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一樣,不同的是回調的 this 自動綁定到調用它的實例上。

方法四:scrollBehavior方法

1.router文件中設置為 mode: 'history', 模式

2.router設置

scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }

原文鏈接:https://blog.csdn.net/qq_40963664/article/details/79850589


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM