新しいルートの最上部へのスクロールが瞬時の場合、うまく動作しないページ遷移があります。 100ミリ秒待ってから、自動的に最上部にスクロールします。次のコードは、まったくスクロールしません。これを行う方法はありますか?
export default new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'Home',
component: Home
}
],
scrollBehavior (to, from, savedPosition) {
setTimeout(() => {
return { x: 0, y: 0 }
}, 100);
}
})
これはVueでネイティブにサポートされています。次のようにscrollBehaviour
を使用してください。
export default new Router({
scrollBehavior() {
return { x: 0, y: 0 };
},
routes: [
{
path: '/',
name: 'Home',
component: Home
}
],
mode: 'history'
});
詳細はこちら 。
他の回答では、次のようなEdgeのケースを処理できません。
http://example.com/foo#bar
は、id
がbar
であるページ上の要素に移動する必要があります。上記のすべてを処理するサンプルコードを次に示します。
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 };
}
}
});
これをすべてのルートで実行したい場合は、ルーターで 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();
});
これはおそらく最良の方法ではありませんが、追加する
_document.body.scrollTop = document.documentElement.scrollTop = 0;
_
ルートのコアコンポーネントの(この場合、Home
)mounted()
関数は、私が望むものを実現します。
これはどうですか ?
router.beforeEach(function (to, from, next) {
window.scrollTo(0, 0)
next()
})
クライアント側のルーティングを使用する場合、新しいルートに移動するときに先頭にスクロールするか、実際のページの再読み込みと同様に履歴エントリのスクロール位置を保持することができます。 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 }
}
}