Vue Academy · レッスン

ナビゲーションガード

ガードを使ってルートを保護し、ナビゲーション時に処理を実行します

レッスン 3/313 ステップ

「ナビゲーションガード」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全3レッスンが含まれています。

ナビゲーションガードとは

ナビゲーションガードを使うと、ルート変更の前後や変更中にコードを実行できます。

  • ナビゲーションをブロックまたはリダイレクトします
  • 認証を確認します
  • ページを離れる前に確認します

ガードの種類

ガードには3つのレベルがあります。

  • グローバルガードはすべてのナビゲーションで実行されます
  • ルート単位のガードは特定の1つのルートで実行されます
  • コンポーネント内のガードはコンポーネント内で実行されます

beforeEachグローバルガード

router.beforeEachはすべてのナビゲーションの前に実行されます。移動先と現在のルートを受け取ります。

router.beforeEach((to, from) => {
  console.log("going to", to.path)
  // return true to allow,
  // or a route to redirect
})

許可とリダイレクト

Vue Router 4では、値を返して処理の流れを制御します。

  • trueまたは何も返さない場合は許可します
  • falseを返すとキャンセルします
  • ルートロケーションを返すとリダイレクトします
router.beforeEach((to) => {
  if (to.meta.requiresAuth && !isLoggedIn()) {
    return { name: "login" }
  }
  return true
})

ルートのmetaフィールド

requiresAuthのようなカスタムmetaデータをルートに追加し、ガードから読み取ります。

const routes = [
  {
    path: "/dashboard",
    component: Dashboard,
    meta: { requiresAuth: true }
  }
]

認証ガード

よく使われる方法は、グローバルガードで認証を確認してルートを保護することです。

router.beforeEach((to) => {
  const authed = localStorage.getItem("token")
  if (to.meta.requiresAuth && !authed) {
    return { name: "login", query: { redirect: to.fullPath } }
  }
})

ルート単位のbeforeEnter

beforeEnterは、ルート定義の中で1つのルートを直接保護します。

const routes = [
  {
    path: "/admin",
    component: Admin,
    beforeEnter: (to, from) => {
      return isAdmin() ? true : { name: "home" }
    }
  }
]

コンポーネント内ガード

コンポーネントに独自のガードを定義できます。onBeforeRouteLeaveは別の場所へ移動するときに実行されます。

import { onBeforeRouteLeave } from "vue-router"

onBeforeRouteLeave((to, from) => {
  if (hasUnsavedChanges.value) {
    return window.confirm("Leave without saving?")
  }
})

onBeforeRouteUpdate

onBeforeRouteUpdateは、ルートが変わっても同じコンポーネントが再利用される場合(パラメーターの変更時)に実行されます。

import { onBeforeRouteUpdate } from "vue-router"

onBeforeRouteUpdate((to) => {
  loadUser(to.params.id)
})

nextコールバック(従来の形式)

古いコードでは、第3引数のnextを使ってナビゲーションを制御します。現在は値を返す方法が推奨されています。

// Classic style with next()
router.beforeEach((to, from, next) => {
  if (canAccess(to)) {
    next()         // proceed
  } else {
    next("/login") // redirect
  }
})

戻り値とnext()の比較

目的は同じですが、方法が2つあります。

  • 値を返す(最新で簡潔な方法)true、false、またはルートロケーションを返します
  • next()を呼び出す(従来の方法)処理を続行またはリダイレクトします

同じガード内で両方を混在させないでください。新しいコードには値を返す方法を推奨します。

理解度チェック

ナビゲーションガードについての理解度を確認します。

まとめ: ナビゲーションガード

ナビゲーションを制御する方法を学びました。

  • beforeEachグローバルガードはすべてのルートで実行されます
  • trueを返すと許可し、falseを返すとキャンセルし、ルートロケーションを返すとリダイレクトします
  • requiresAuthのようなmetaフィールドで認証チェックを制御します
  • beforeEnterは1つのルートを保護します
  • onBeforeRouteLeaveのようなコンポーネント内ガードで、ページを離れる処理を行います

Vue.jsの基礎コースをすべて修了しました。

無料で開始

AI チューターと学ぶ HTML — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
42
レッスン
156

よくある質問

「ナビゲーションガード」レッスンは無料ですか?

はい。「ナビゲーションガード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全3レッスンが含まれています。

「ナビゲーションガード」で何を学びますか?

ガードを使ってルートを保護し、ナビゲーション時に処理を実行します ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「ナビゲーションガード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vue Routerの設定
  2. ネストしたルートと動的ルート
  3. ナビゲーションガード
← Vue Academyに戻る