Vue Router 滚动行为

滚动行为

滚动行为

vue-router可以让你自定义路由切换时页面如何滚动(滚动到顶部或保持原先的滚动位置)。

注:该功能只在支持history.pushState的浏览器中可用。

可以在Router实例中提供一个scrollBehavior方法:

const router = new VueRouter({
    routes,
    scrollBehavior(to, from, savedPosition) {
        return {
            x: 0,
            y: 400
        }
    }
})

scrollBehavior方法接收三个参数:to、from、savedPosition

to:Route  目标路由对象

from:Route  当前要离开的路由对象

savedPosition:Object  记录离开前的滚动位置  { x : number, y : number }

scrollBehavior方法的返回值:PositionResult

当且仅当popstate导航(即通过浏览器的前进/后退按钮触发)时才可用

查看scrollBehavior方法的底层代码:

scrollBehavior?: (
  to: Route,
  from: Route,
  savedPosition: Position | void
) => PositionResult | Promise<PositionResult> | undefined | null

所以从上面可以看出,scrollBehavior方法可以返回undefined、null、PositionResult(同步滚动)、Promise<PositionResult>(异步滚动)

再进一步,Postion:

type Position = { x: number; y: number }

PositionResult:

type PositionResult = Position | { selector: string; offset?: Position, behavior?: ScrollBehavior } | void

|后面一大堆不知道什么意思,但前面的Position前面有提过,其实就是当前的滚动位置。

若返回一个falsy(虚值,在Boolean上下文中认为是false的值,包含但不限于false)的值,或者一个空对象({  }),则不会发生滚动。

返回值举例🍸:

1.直接返回带x,y坐标的对象,对于所有路由导航,简单地让页面滚动到顶部

scrollBehavior (to, from, savedPosition) {
  return { x: 0, y: 0 }
}

2.返回savedPosition,在按下后退/前进按钮时,才能用

如果是点击前进/后退,跳转后仍保留在当前位置->返回savedPosition

否则就是普通的路由跳转,滚动到顶部->直接返回Position(即坐标对象)

scrollBehavior (to, from, savedPosition) {
  if (savedPosition) {
    return savedPosition
  } else {
    return { x: 0, y: 0 }
  }
}

3.返回带selector选择器的对象

模拟‘滚动到锚点’的行为

这里的selector就是元素选择器,对于html中有一元素<p id="anchor2" style="height:500px">Anchor2</p>,to.hash的值可以是‘#anchor2’

scrollBehavior (to, from, savedPosition) {
  if (to.hash) {
    return {
      selector: to.hash
    }
  }
}

异步滚动

即返回Promise<PositionResult>。

scrollBehavior (to, from, savedPosition) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({ x: 0, y: 0 })
    }, 500)
  })
}

将其挂载到从页面级别的过渡组件的事件上,令其滚动行为和页面过渡一起良好运行是可能的。但是考虑到用例的多样性和复杂性,我们仅提供这个原始的接口,以支持不同用户场景的具体实现。

平滑滚动

将behavior选项添加到scrollBehavior返回的对象中,就可以为支持它的浏览器启用原生平滑滚动

scrollBehavior (to, from, savedPosition) {
  if (to.hash) {
    return {
      selector: to.hash,
      behavior: 'smooth',
    }
  }
}
posted @ 2021-10-18 16:11  慕斯星球  阅读(570)  评论(0)    收藏  举报