组件使用的是keep-live然后每次进入详情页都会显示底部,使用document.documentElement.scrollTop = 0 后,第一次进入回回到顶端,但是通过别的编辑按钮进入详情时 , 激活的生命周期函数内 document.documentElement.scrollTop值为0, 页面却没有变化, 求指教,谢谢。
首先需要理解 keep-alive 组件是如何工作的。keep-alive 组件会缓存被包裹的组件,从而避免重复的创建和销毁。当组件进入缓存时,其生命周期钩子函数 mounted 和 activated 将不会被调用,而是会调用 deactivated 钩子函数。当组件从缓存中移除时,activated 钩子函数将被调用。
在你的情况下,你可能是在 activated 钩子函数中设置了 document.documentElement.scrollTop = 0,但是在使用别的编辑按钮进入详情时,缓存中的组件被重新激活时,不会再次调用 activated 钩子函数,导致滚动位置没有变化。
为了解决这个问题,你可以尝试在 beforeRouteEnter 钩子函数中设置滚动位置,该钩子函数在进入路由前被调用。代码示例如下:
beforeRouteEnter(to, from, next) {
// 保存滚动位置
const savedPosition = sessionStorage.getItem('savedPosition')
if (savedPosition) {
sessionStorage.removeItem('savedPosition')
// 恢复滚动位置
next(vm => {
vm.$nextTick(() => {
document.documentElement.scrollTop = savedPosition
})
})
} else {
next()
}
},
beforeRouteLeave(to, from) {
// 保存滚动位置
sessionStorage.setItem('savedPosition', document.documentElement.scrollTop)
},
在 beforeRouteEnter 钩子函数中,我们首先检查 sessionStorage 中是否有保存的滚动位置,如果有,我们将其恢复,否则不做任何操作。在 befo
reRouteLeave 钩子函数中,我们保存当前滚动位置到 sessionStorage 中,以便在下次进入页面时恢复滚动位置。
注意,在 beforeRouteEnter 钩子函数中,我们需要使用 next(vm => {}),其中 vm 是组件实例,我们需要等到组件实例创建完成后才能恢复滚动位置,因此在 vm.$nextTick 回调中设置滚动位置。
希望这能帮助你解决问题。