使用前端路由,当切换到新路由时,想要页面滚动到顶部或者是保持原先的滚动位置,就像从新加载页面那样。html
vue-router能作到,并且更好,它让你能够自定义路由切换时页面如何滚动。前端
注意:这个功能只在支持 history.pushState
的浏览器中可用。vue
当建立一个Router实例,你能够提供一个scrollBehavior
方法git
const router = new VueRouter({ routes: [...], scrollBehavior (to, from, savedPosition) { // return 指望滚动到哪一个的位置 // to:要进入的目标路由对象,到哪里去ss console.log(to) // from:离开的路由对象,从哪儿来 console.log(from) // savedPosition: 会记录滚动条的坐标,点击"后退/前进" 时的记录值(x:?,y:?) console.log(savedPosition) } })
scrollBehavior
方法接收 to
和 from
路由对象。第三个参数 savedPosition
当且仅当 popstate
导航(经过浏览器的 前进/后退 按钮触发)时才可用。github
该方法返回滚动位置信息,以下所示:vue-router
{ x: number, y: number }
{ selector: string, offset? : { x: number, y: number }}
(offset 只在 2.6.0+ 支持)若是返回一个falsy值(falsy不是false,参考文档),或者是一个空对象,那么不会发生滚动。浏览器
举例:app
scrollBehavior (to, from, savedPosition) { return { x: 0, y: 0 } }
对于全部路由导航,简单的让页面滚动到顶部。异步
返回 savePosition
,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:ide
scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { x: 0, y: 0 } } }
若是你要模拟“滚动到锚点”的行为:
scrollBehavior (to, from, savedPosition) { if (to.hash) { return { selector: to.hash } } }
还能够利用路由元信息更细颗粒度的控制滚动。详细例子请移步这里。
2.8.0 新增
scrollBehavior (to,from,savedPosition) { return new Promise((resolve, reject) => { setTimeout(() => { resolve({x:0,y:0}) },500) }) }
将其挂在到从页面级别的过渡组件的事件上,令其滚动行为和页面过渡行为一块儿良好运行是可能的。可是考虑到用例的多样性和复杂性,咱们仅提供这个原始的借口,以支持不一样用户场景的具体实现。
const HomePage = () => import('@/page/homePage/HomePage-2.0'); /* 首页 */ const ProductDetail = () => import('@/page/serviceProvider/ProductDetail'); /* 主要产品详情 */ const scrollBehavior = (to, from, savedPosition) => { let returnData = {} if(savedPosition){ returnData = savedPosition } else{ returnData.x = 0 returnData.y = 0 } return returnData } export default new Router({ mode: 'history', scrollBehavior, routes: [ { path: '/', name: 'HomePage', component: HomePage, /* 首页 */ children: [ { path: '/ProductDetail', name: 'ProductDetail', component: ProductDetail, /* 产品详情 */ }, ] } ] })