1 默认情况下,从当前页面切换至目标页面时,Nuxt.js 会让目标页面滚动至顶部。
但是在嵌套子路由的场景下,Nuxt.js 会保持当前页面的滚动位置,除非在子路由的页面组件中将 scrollToTop 设置为 true。
<template>
<h1>子页面组件</h1>
</template>
<script>
export default {
scrollToTop: true
}
</script>
全局添加
创建路由器实例时,可以提供以下scrollBehavior函数:
const router = new VueRouter({
routes: [...],
scrollBehavior (to, from, savedPosition) {
// return desired position
}
})
该scrollBehavior函数接收to和from路由对象。第三个参数 ,savedPosition仅当这是一个popstate导航(由浏览器的后退/前进按钮触发)时才可用。
该函数可以返回一个滚动位置对象。对象可以是以下形式:
{ x: number, y: number }
{ selector: string, offset? : { x: number, y: number }}(仅在 2.6.0+ 中支持偏移)
如果返回虚假值或空对象,则不会发生滚动。
例如:
scrollBehavior (to, from, savedPosition) {
return { x: 0, y: 0 }
}
这只会使页面滚动到所有路线导航的顶部。
使用后退/前进按钮导航时,返回savedPosition将导致类似本机的行为:
scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { x: 0, y: 0 }
}
}
这是官网给的方法但是有bug在里面,经过调试,发现得通过异步来处理
故全局添加的最终代码是
在根目录添加app文件夹,里面添加 router.scrollBehavior.js 把以下代码放进去即可。
export default function (_to, _from, savedPosition) {
return new Promise((resolve) => {
setTimeout(() => resolve(savedPosition || { x: 0, y: 0 }), 180)
})
}
参考官网链接
https://nuxtjs.org/docs/configuration-glossary/configuration-router/#scrollbehavior