ナビゲーションガード
ガードを使ってルートを保護し、ナビゲーション時に処理を実行します
「ナビゲーションガード」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Vue Routerの設定
- ネストしたルートと動的ルート
- ナビゲーションガード