SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
てるてる動画

SPAでも戻るボタンで元のスクロール位置に戻りたい(vue)

問題

vue、vue routerで作っているSPAのページ移動で、ブラウザの戻るボタンを押したとき、前の位置に戻りたいです。

どうも上に戻ってしまうようです。

答え

vue routerで画面遷移時のスクロール位置をコントロールするには scrollBehavior を使う。

上に戻したい

意図的に上に戻さないと、位置はページの途中のまま画面が切り替わる状況があります。

通常は上に戻ってよいと思うので、以下のようにします。

const router = createRouter({
scrollBehavior(to, from, savedPosition) {
return { top: 0 }
},
})

前のスクロール位置に戻したい

一覧ページのようなページに戻るときは、静的ページのように、前の位置に戻るのが直感的かもしれません。

前の位置に戻るには、以下のようにします。

const router = createRouter({
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { top: 0 }
}
},
})

時間差で前のスクロール位置に戻したい(若干無理やり)

上の方法でもうまくいかないことがあります。

検索結果などを画面表示後に非同期で取得している場合などでは、画面表示直後では元の位置に戻ろうにも戻れず、期待している位置に戻らない。

手抜きして、0.5秒後にスクロール位置を移動する方法。

const router = createRouter({
scrollBehavior: function(to, form, savedPosition){
if (savedPosition) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(savedPosition)
}, 500)
})
} else {
return {x:0, y:0}
}
}
})

ページ遷移直後に savedPosition を保存しておいて、検索結果取得後にスクロール位置を移動するようにするほうが、動きは違和感がないかもしれません。

関連するメモ

コメント