Vue RouterでbeforeEnterとwindow.locationを組み合わせて外部サイトへページ遷移させてみた

January 24, 2019,
tags: vuejs vue-router


このエントリーをはてなブックマークに追加

Vue Routerにはナビゲーションガードという機能があります。

ルート単位で、制御したい場合には[beforeEnter]ガードを使うことできます。

よくある一覧メニューのなかで一部だけ外部ページへ飛ばしたい場合があります。
例えば以下のような形です。
複数あるリストで、外部リンクになる可能性がある要素が混じっている場合ですね。

<template>
  <ul>
    <li v-for="item in items">
      <router-link :to="item.link">
        {{ item.name }}
      </router-link>
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    retuern {
      items: [
        {
          name: 'TOP',
          link: {
            name: 'index'
          }
        },
        {
          name: 'user 1',
          link: {
            name: 'user',
            params: {
              id: 1
            }
          }
        },
        {
          name: 'amazon',
          link: {
            name: 'amazon',
          }
        }

      ]
    }
  }

}
</script>

まあ無理やり出し分けるってのもあるんですが、なるべくitemsの構造はシンプルにしたい。 そんなときにbeforeEnterを使うのがいいのかなと思いました。

// router.js

import Vue from 'vue'
import Router from 'vue-router'

import Index './components/Index'
impport User './components/User'

const routes = [
  {
    name: 'index',
    path: '/',
    compnent: Index
  },
  {
    name: 'user',
    path: '/user/:id',
    compnent: User
  },
  {
    name: 'user',
    path: '/user/:id',
    beforeEnter() {
      window.location = "https://www.amazon.co.jp/"
    }
  }
]

Vue.use(Router)
export default new Router({
  mode: 'history',
  routes
})

こんな感じに外部リンクもvue-routerで定義しておけば、コンポーネント側で外部リンクかどうかの出し分けの処理も実装しなくて良くなるので、スッキリするかと思います。

参考記事

VueJs vue-router linking an external website

comments powered by Disqus