首先在定义路由的页面:
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
scrollBehavior(to, from, savedPosition) {
console.log(savedPosition, to.meta.savedPosition)
if (savedPosition) {
return savedPosition
} else {
if (from.meta.keepAlive) {
from.meta.savedPosition = from.meta.y;
}
return {
x: 0,
y: to.meta.savedPosition || 0
}
}
}
});
然后定义两个公共方法:
getScrollTop
//获取滚动距离 并赋值给meta.y
export function getScrollTop(node, router, n){
console.log(n)
let that = this
let dom = document.querySelector(node)
// console.log(dom)
dom.onscroll=function(){
if (dom.timerId) clearTimeout(dom.timerId)
dom.timerId = setTimeout(() => {
if(n){
router.meta.y = n
}else{
router.meta.y = dom.scrollTop
}
console.log(dom.scrollTop)
}, 300)
}
}
在mounted中调用
mounted() {
getScrollTop('.scrollBox', this.$route)
}
setScrollTop()
//设置滚动距离
export function setScrollTop(node, router, n){
console.log(router.meta, n, router.meta.savedPosition)
let dom = document.querySelector(node)
if(n){
dom.scrollTop = n
}else{
// 返回上一页时使用router.meta.savedPosition赋值。没有跳转,在当前页赋值用dom.scrollTop
dom.scrollTop = router.meta.savedPosition || dom.scrollTop
}
}
在keepAlive为true的页面调用时
activated(){
setScrollTop('.scrollBox', this.$route)
}