目次
グローバル フロント ガード
Global Resolution Guard
ルーティング専用ガード
コンポーネント内のガード
ナビゲーション解析プロセスを完了
ホームページ ウェブフロントエンド フロントエンドQ&A Vue のナビゲーション ガードとは何ですか?

Vue のナビゲーション ガードとは何ですか?

Dec 22, 2021 pm 06:31 PM
vue

ナビゲーション ガードには次のものが含まれます: 1. グローバル プレガード "beforeEach"; 2. グローバル解析ガード "beforeResolve"; 3. ルート専用ガード "beforeEnter"; 4. コンポーネント内のガード "beforeRouteEnter"、" beforeRouteLeave」。

Vue のナビゲーション ガードとは何ですか?

このチュートリアルの動作環境: Windows7 システム、vue2.9.6 バージョン、DELL G3 コンピューター。

vue-router が提供するナビゲーション ガードは、主にジャンプやキャンセルによるナビゲーションのガードに使用されます。ルート ナビゲーション プロセスを組み込む機会は複数あります。グローバル、単一ルート専用、またはコンポーネント レベルです。

パラメータやクエリを変更しても、開始/終了ナビゲーション ガードはトリガーされないことに注意してください。 $route オブジェクトを監視するか、コンポーネント内ガード beforeRouteUpdate を使用することで、これらの変更に対応できます。

グローバル フロント ガード

router.beforeEach を使用してグローバル フロント ガードを登録できます:

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
})
ログイン後にコピー

ナビゲーションがトリガーされると、グローバル フロント ガードがGuard セットされたガードは、作成された順序で呼び出されます。ガードは非同期で解析および実行されます。この時点で、ナビゲーションはすべてのガードが解決されるまで待機します。

各ガード メソッドは 3 つのパラメータを受け取ります:

  • to: Route: 入力されるターゲット ルーティング オブジェクト

  • from: Route: 現在のナビゲーションが出発しようとしているルート

  • next: 機能: このフックを解決するには、このメソッドを呼び出す必要があります。実行効果は、次のメソッドの呼び出しパラメータによって異なります。

    • next(): パイプラインの次のフックに進みます。すべてのフックが実行されると、ナビゲーションのステータスが確認されます。

    • next(false): 現在のナビゲーションを中断します。ブラウザの URL が変更されると (おそらくユーザーが手動で、またはブラウザの [戻る] ボタンによって)、URL アドレスは from ルートに対応するアドレスにリセットされます。

    • next('/') または next({ path: '/' }): 別のアドレスにジャンプします。現在のナビゲーションが中断され、新しいナビゲーションが開始されます。任意の場所オブジェクトを next に渡すことができ、replace: true、name: 'home' などのオプション、および prop または router.push へのルーターリンクで使用されるオプションを設定することができます。

    • next(error): (2.4.0) next に渡されたパラメータが Error インスタンスの場合、ナビゲーションは終了し、エラーは router.onError() に渡されます。登録されたコールバック。

# 次の関数が特定のナビゲーション ガード内で 1 回だけ呼び出されることを確認します。これは複数回出現できますが、すべての論理パスが重複していない場合に限ります。そうでない場合、フックは解析されないか、エラーが報告されます。ユーザーが認証に失敗した場合に /login にリダイレクトする例を次に示します。

// BAD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  // 如果用户未能验证身份,则 `next` 会被调用两次
  next()
})
// GOOD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  else next()
})
ログイン後にコピー

Global Resolution Guard

New in 2.5.0

2.5.0 では、router.beforeResolve を使用してグローバル ガードを登録できます。これは、ナビゲーションが確認される前、およびすべてのコンポーネント内ガードと非同期ルート コンポーネントが解析された後に解析ガードが呼び出される点を除いて、router.beforeEach に似ています。

ルーティング専用ガード

ルーティング設定で beforeEnter ガードを直接定義できます:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})
ログイン後にコピー

これらのガードとグローバル プレガードのメソッドパラメータは同じです。

コンポーネント内のガード

最後に、次のルート ナビゲーション ガードをルーティング コンポーネント内で直接定義できます:

  • beforeRouteEnter

  • beforeRouteUpdate (2.2 の新機能)

  • beforeRouteLeave

const Foo = {
  template: `...`,
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}
ログイン後にコピー

beforeRouteEnter ガードはアクセスできませんこれは、ナビゲーションが確認される前にガードが呼び出されるため、これから登場する新しいコンポーネントはまだ作成されていません。

ただし、コールバックを next に渡すことでコンポーネント インスタンスにアクセスできます。ナビゲーションを確認したらコールバックを実行し、コールバックメソッドのパラメータとしてコンポーネントインスタンスを渡します。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}
ログイン後にコピー

beforeRouteEnter は、next へのコールバックの受け渡しをサポートする唯一のガードであることに注意してください。 beforeRouteUpdate と beforeRouteLeave の場合、これはすでに利用可能であるため、コールバックの受け渡しは必要ないためサポートされていません。

beforeRouteUpdate (to, from, next) {
  // just use `this`
  this.name = to.params.name
  next()
}
ログイン後にコピー

この離脱ガードは通常、ユーザーが変更を保存する前に突然離脱することを防ぐために使用されます。このナビゲーションは next(false) でキャンセルできます。

beforeRouteLeave (to, from, next) {
  const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
  if (answer) {
    next()
  } else {
    next(false)
  }
}
ログイン後にコピー

ナビゲーション解析プロセスを完了

  • ナビゲーションがトリガーされます。

  • 非アクティブ化されたコンポーネントで beforeRouteLeave ガードを呼び出します。

  • 各ガードの前にグローバルを呼び出します。

  • 再利用されたコンポーネントで beforeRouteUpdate ガード (2.2) を呼び出します。

  • ルーティング設定に入る前に呼び出します。

  • 非同期ルーティング コンポーネントを解決します。

  • アクティブ化されたコンポーネントのRouteEnterの前に呼び出します。

  • グローバル beforeResolve ガード (2.5) を呼び出します。

  • #ナビゲーションを確認しました。

  • グローバル afterEach フックを呼び出します。

  • DOM 更新をトリガーします。

  • beforeRouteEnter ガードで next に渡されるコールバック関数を呼び出すと、作成されたコンポーネント インスタンスがコールバック関数のパラメータとして渡されます。

[関連する推奨事項:「vue.js チュートリアル」]

以上がVue のナビゲーション ガードとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

VueでBootstrapの使用方法 VueでBootstrapの使用方法 Apr 07, 2025 pm 11:33 PM

vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

VUEのボタンに関数を追加する方法 VUEのボタンに関数を追加する方法 Apr 08, 2025 am 08:51 AM

HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

VueでWatchの使用方法 VueでWatchの使用方法 Apr 07, 2025 pm 11:36 PM

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

Vue Multi-Page開発とはどういう意味ですか? Vue Multi-Page開発とはどういう意味ですか? Apr 07, 2025 pm 11:57 PM

VUEマルチページ開発は、VUE.JSフレームワークを使用してアプリケーションを構築する方法です。アプリケーションは別々のページに分割されます。コードメンテナンス:アプリケーションを複数のページに分割すると、コードの管理とメンテナンスが容易になります。モジュール性:各ページは、簡単に再利用および交換するための別のモジュールとして使用できます。簡単なルーティング:ページ間のナビゲーションは、単純なルーティング構成を介して管理できます。 SEOの最適化:各ページには独自のURLがあり、SEOに役立ちます。

vue.jsでJSファイルを参照する方法 vue.jsでJSファイルを参照する方法 Apr 07, 2025 pm 11:27 PM

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

Vueによる前のページに戻る方法 Vueによる前のページに戻る方法 Apr 07, 2025 pm 11:30 PM

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes< router-link to ="/" Component Window.history.back()、およびメソッド選択はシーンに依存します。

VUEトラバーサルの使用方法 VUEトラバーサルの使用方法 Apr 07, 2025 pm 11:48 PM

Vue.jsには配列とオブジェクトを通過するには3つの一般的な方法があります。V-Forディレクティブは、各要素をトラバースしてテンプレートをレンダリングするために使用されます。 V-BindディレクティブをV-Forで使用して、各要素の属性値を動的に設定できます。 .mapメソッドは、配列要素を新しい配列に変換できます。

VueのDivにジャンプする方法 VueのDivにジャンプする方法 Apr 08, 2025 am 09:18 AM

VUEにDIV要素をジャンプするには、VUEルーターを使用してルーターリンクコンポーネントを追加するには、2つの方法があります。 @clickイベントリスナーを追加して、これを呼び出します。$ router.push()メソッドをジャンプします。

See all articles