vue使⽤keep-alive保持滚动条位置的实现⽅法
js控制滚动条前⾔
下班前,20分钟,发⼀篇。。。
简单介绍,使⽤keep-alive的时候,返回前⼀页,没有保持滚动条位置。
事实上,就算不使⽤keep-alive,位置也没有被记录。
但是,在不适⽤keep-alive的时候,页⾯内容会刷新,所以就随他去了……就是这么任性……
思路
官⽅有推荐⼀个scrollBehavior,,但是上⾯标注,只在history.pushState的浏览器⽣效,不知道是不是只能开启
history.pushState才可以使⽤,看了下实现,挺不友好的,还是⾃⼰搞⼀个吧。。。
实现思路是这样的,⾸先给路由增加⼀个对象meta:
meta: {
keepAlive: true,
scrollTop: 0,
}
keepAlive是否需要保持页⾯,scrollTop记录页⾯的滚动位置。
然后在app.vue增加如下⼊⼝:
<keep-alive>
<router-view v-if="$a.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$a.keepAlive"></router-view>
这样就启⽤keep-alive了。
然后在全局main.ts增加⼀个全局路由控制:
router.beforeEach((to: Route, from: Route, next: () => void) => {
if (a.keepAlive) {
const $content = document.querySelector('#content');
const scrollTop = $content ? $content.scrollTop : 0;
}
next();
});
很简单,离开的时候判断当前页是否需要保持页⾯,如果需要,记录页⾯主容器content的滚动位置,写⼊路由。
然后,每次进⼊保持好的页⾯,读取滚动条位置scrollTop,修改主容器的scrollTop,就搞定了:
public activated() {
const scrollTop = this.$a.scrollTop;
const $content = document.querySelector('#content');
if (scrollTop && $content) {
$content.scrollTop = scrollTop;
}
}
看起来很简单哦。
遗留问题
1、是不是每个页⾯都可以记录滚动条位置呢?
其实不是的,有的页⾯,内部有js交互,⽐如tab交互,不同的tab,页⾯可滚动的⾼度不⼀致,如果不保持页⾯状态⽽统⼀记录滚动位置,有可能导致滚动条的位置错位。
2、能不能把activated这⼀步写到全局的main.ts或者state去呢?
有想过这点,但是⽬前来说,没到实现的⽅法。
⾸先,如果通过router来控制,做不到,全局路由控制只能在页⾯加载前监听,取不到载⼊页的元素。
如果写在⼀个通⽤的全局函数去控制,⽐如定义⼀个state,当页⾯加载完的时候设置,那需要定义⼀个mixins来处理,但是对这个mixins不太熟悉,暂时还不知道该怎么做,可能有时间个⽅法搞定它。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。