Vue.js在setTimeout之后滚动到新页面路径的顶部

fro*_*sty 15 vue.js vue-router

当滚动到新路径的顶部是即时的时,我有一个页面转换不能很好地工作.我想在它自动滚动到顶部之前等待100ms.以下代码根本不会滚动.有没有办法做到这一点?

export default new Router({
    mode: 'history',
    routes: [
        {
            path: '/',
            name: 'Home',
            component: Home
        }
    ],
    scrollBehavior (to, from, savedPosition) {
        setTimeout(() => {
            return { x: 0, y: 0 }
        }, 100);
    }
})
Run Code Online (Sandbox Code Playgroud)

Edg*_*ero 40

现在Vue本身支持这个,只需使用scrollBehaviour,如下所示:

export default new Router({
  scrollBehavior() {
    return { x: 0, y: 0 };
  },
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    }
  ],
  mode: 'history'
});
Run Code Online (Sandbox Code Playgroud)

更多这里.

  • 这工作并且是Vue Router的原生,应该是明确的答案. (2认同)

Muh*_*eed 14

其他答案无法处理边缘情况,例如:

  1. 保存位置 - 当用户单击后退或前进位置时,将保存位置.我们希望维护用户正在查看的位置.
  2. 哈希链接 -例如,http://example.com/foo#bar要导航到一个页面上的元素idbar.
  3. 最后,在所有其他情况下,我们可以导航到页面顶部.

以下是处理以上所有内容的示例代码:

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
  scrollBehavior: (to, from, savedPosition) => {
    if (savedPosition) {
      return savedPosition;
    } else if (to.hash) {
      return {
        selector: to.hash
      };
    } else {
      return { x: 0, y: 0 };
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 当我们谈论后退按钮时,这是一个很好的用户体验。用户被带回他们上次看到的屏幕。如果我们在用户回弹时跳到页面顶部,他们将暂时迷失方向。大多数人都会复制/粘贴代码,我认为提供一些额外的细节是有帮助的,只要它不会影响主要答案即可。 (5认同)

Pat*_*our 9

如果您希望在每个路由上发生这种情况,您可以在路由器的前挂钩中执行此操作:

const router = new VueRouter({ ... })

router.beforeEach(function (to, from, next) { 
    setTimeout(() => {
        window.scrollTo(0, 0);
    }, 100);
    next();
});
Run Code Online (Sandbox Code Playgroud)

如果您使用的是较旧版本的vue-router,请使用:

router.beforeEach(function (transition) { 
    setTimeout(() => {
        window.scrollTo(0, 0);
    }, 100);
    transition.next();
});
Run Code Online (Sandbox Code Playgroud)


fro*_*sty 1

这可能不是最好的方法,但添加

document.body.scrollTop = document.documentElement.scrollTop = 0;

在路由的核心组件(在本例中为Homemounted()函数中实现了我想要的。

  • 不必要,这是 Vue 原生支持的。 (3认同)