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

yv5phkfx  于 2023-04-21  发布在  Vue.js
关注(0)|答案(7)|浏览(109)

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

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

aor9mmx11#

现在Vue已经原生支持了,使用scrollBehaviour,如下所示:

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

More here

bvpmtnay

bvpmtnay2#

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

  1. Saved Position-当用户单击后退或前进位置时,将保存位置。我们希望保持用户正在查看的位置。
  2. Hash Links-例如,http://example.com/foo#bar应该导航到页面上idbar的元素。
    1.最后,在所有其他情况下,我们可以导航到页面的顶部。
    下面是处理上述所有问题的示例代码:
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 };
    }
  }
});
1tuwyuhd

1tuwyuhd3#

如果您希望在每一条路由上都执行此操作,可以在路由器的hook之前执行此操作:

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

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

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

router.beforeEach(function (transition) { 
    setTimeout(() => {
        window.scrollTo(0, 0);
    }, 100);
    transition.next();
});
zz2j4svz

zz2j4svz4#

如果你想等待很长时间,使用scrollBehaviour的异步滚动,像这样:

export default new Router({
  scrollBehavior() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({ x: 0, y: 0 })
      }, 100)
    })
  },
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    }
  ],
  mode: 'history'
});

再来点。

jljoyd4f

jljoyd4f5#

这可能不是最好的方法,但添加
document.body.scrollTop = document.documentElement.scrollTop = 0;
在路由器核心组件(在本例中为Home)的mounted()函数中实现了我想要的功能。

zkure5ic

zkure5ic6#

当使用客户端路由时,我们可能希望在导航到新路由时滚动到顶部,或者像真实的页面重新加载一样保留历史条目的滚动位置。vue-router允许您实现这些,甚至更好,允许您完全自定义路由导航上的滚动行为。

注意:此功能仅在浏览器支持history.pushState的情况下有效。

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

已保存职位:

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

了解更多信息

dzjeubhm

dzjeubhm7#

它就像这段代码一样简单:

const router = createRouter({
    history: createWebHistory(),
    scrollBehavior(to, from, savedPosition) {
        return { top: 0 } // always scroll to top
    },
    routes,
});

相关问题