hoge

いわゆるWeb Developerの備忘録

Vue Routerでスクロール位置を保持する

Vue Router は SPA を構築するために、Vue のコンポーネントを適切に切り替えてくれます。

新しくリンクをクリックした時、遷移先が同じコンポーネントを使っていれば異なるコンポーネントだけを描画し直してくれるので、画面下部までスクロールしていたとしても、遷移先でも下部の位置を保持します。

ただこれは従来の Web サイトの挙動と異なるものであり、開発者の意図しない位置の保持や破棄は UX に直結します。

同じコンポーネント同士の遷移であれば以下のようにすることで、ページを進めた時は頁のトップへ、ページを戻ったときは遷移元と同じスクロール位置に移動することが可能です。

const router = new VueRouter({
  mode: "history",
  routes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition;
    } else {
      return { x: 0, y: 0 };
    }
  }
});

同じコンポーネントを使っていればスクロール位置を保持してくれますが、遷移先が異なるコンポーネントで戻るボタンを押した時、位置を保持することができません。

異なるコンポーネントの遷移では Vue の created メソッドが呼ばれるため、コンポーネントが再構成されます。created が呼ばれるということはコンポーネントで保持していたデータを破棄してしまうので、描画された HTML がなくなりページ全体の大きさが ajax で取得される前に戻ってしまいます。

その場合コンポーネントにデータを持たせるのではなく、Vuex を使って Vue 全体のデータの一部として管理することで破棄されなくなります。

戻る遷移を行ったときに Vuex にデータがない場合は created メソッドで呼び出すように分岐することで、データが更新されるのを回避します。

computed: {
  data() {
    return this.$store.state.data;
  },
  created() {
    if (!this.data.length) {
      this.fetchData();
    }
  },
  async fetchData() {
  /* ajaxを呼び出す処理 */
  }
},

同じカテゴリー(Tech)の記事
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
Vue Routerでスクロール位置を保持する
    コメント(0)