參考:https://blog.csdn.net/qq_40204835/article/details/79853685
方法一: 利用Keep-Alive和監聽器
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) }
4.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); }
方法二:利用beforeRouteLeave和watch
main.js中:
var store = new Vuex.Store({ //記得先引入vuex 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() }
方法三:(適用於方法二獲取不到滾動位置)
組件中:
<template> <div ref="div1">
··· 內容···
</div> </template>
beforeRouteEnter(to, from, next) { next(vm => { const div1 = vm.$refs.div1 // 記錄滾動高度 div1.scrollTop = vm.scroll }) }, beforeRouteLeave(to, from, next) { const div1 = this.$refs.div1; this.scroll = div1.scrollTop; //data中記得定義變量scroll next() }
注:在路由配置中,記住滾動的頁面keep-alive需為true