2020-01-13

【Vue Router】ブラウザバック(戻るボタン)で beforeEach() がうまく動作しない

やりたいこと

Vue Routerを利用した認証機能付きSPAで、ログイン状態でログインフォーム(/login)にアクセスした際、ホーム画面(/home)に強制遷移させたい。

基本方針

Vue Router の beforeEach() を利用して以下のように記述。(認証状態はVuexに持たせています)

router.js

router.beforeEach((to, from, next) => {
  if (!to.meta.requireAuth && store.state.auth.isAuth) {
    next('/home');
  }
  next();
}

発生した問題

Vue Router を利用したリダイレクト this.$router.push('/login') や、ページリロードした場合には上記 beforeEach() が機能するが、ブラウザの戻るボタンを押したときにはそのままログインフォームに戻ってしまう。

解決法

mounted() で対処する

Login.vue

mounted() {
  if (this.$store.state.auth.isAuth) {
    this.$router.push('/home');
  }
}

ブラウザバックによるページ遷移制御をVue Routerで行うのは限度があるので、Vueコンポーネント側で対処する。

せっかくVue Routerがあるのに…という感じだが仕方ない。ブラウザバックは厄介なので…

参考

https://laracasts.com/discuss/channels/vue/vue-2-how-to-redirect-route-on-hitting-browser-back