參考:https://blog.csdn.net/qq_40204835/article/details/79853685
方法一: 利用Keep-Alive和監(jiān)聽器
1.首先在路由中引入需要的模塊
{
path: ‘/scrollDemo’,
name: ‘scrollDemo’,
meta: {
keepAlive: true // 需要緩存
},
component: resolve => { require([‘../view/scrollDemo.vue’], resolve) }
}
2.在App.vue中設置緩存組件
<keep-alive> // 緩存組件跳轉的頁面
<router-view v-if="$route.meta.keepAlive" class="ui-view" transition-mode="out-in"></router-view>
</keep-alive>
// 非緩存組件跳轉頁面
<router-view v-if="!$route.meta.keepAlive" class="ui-view" transition-mode="out-in"></router-view>
3.在頁面注冊對應的事件
(1). 在data中定義一個初始值 scroll
(2). 在mouted中 ,mouted中的方法代表dom已經加載完畢
window.addEventListener('scroll', this.handleScroll);
(3).methods 用于存放頁面函數
handleScroll () {
this.scroll = document.documentElement && document.documentElement.scrollTop
console.log(this.scroll)
}
- activated 為keep-alive加載時調用
activated() {
if(this.scroll > 0){
window.scrollTo(0, this.scroll);
this.scroll = 0;
window.addEventListener('scroll', this.handleScroll);
}
}
5.deactivated 頁面退出時關閉事件 防止其他頁面出現問題
deactivated(){
window.removeEventListener('scroll', this.handleScroll);
}
方法二:利用vuex + beforeRouteLeave + watch
main.js中:
var store = new Vuex.Store({
state: {
recruitScrollY: 0
},
getters: {
recruitScrollY: state => state.recruitScrollY
},
mutations: {
changeRecruitScrollY(state, recruitScrollY) {
state.recruitScrollY = recruitScrollY;
}
},
actions: {
},
modules: {}
})
組件中(/flashSaleListX為當前組件,即需要記住滾動條位置的組件):
methods:{
isTabRoute: function() {
if (this.$route.path === '/flashSaleListX') {
let recruitScrollY = this.$store.state.recruitScrollY
document.documentElement.scrollTop = recruitScrollY;
}
}
},
watch: {
'$route': 'isTabRoute',
},
beforeRouteLeave(to, from, next) {
let position = document.documentElement && document.documentElement.scrollTop; //記錄離開頁面時的位置
if (position == null) position = 0
this.$store.commit('changeRecruitScrollY', position) //離開路由時把位置存起來
next()
}