Vue Router の 10 の高度なヒントのまとめ

Vue Router の 10 の高度なヒントのまとめ

序文

Vue Router は、Vue.js の公式ルーティング マネージャーです。

Vue.js のコアと深く統合されているため、シングルページ アプリケーションを簡単に構築できます。

含まれる機能は次のとおりです:

  • ネストされたルート/ビューテーブル
  • モジュール式のコンポーネントベースのルーティング構成
  • ルートパラメータ、クエリ、ワイルドカード
  • Vue.js トランジションシステムに基づくトランジション効果を表示する
  • きめ細かなナビゲーションコントロール
  • 自動的にアクティブ化された CSS クラスを持つリンク
  • HTML5 履歴モードまたはハッシュモード、IE9 では自動的にダウングレードされる
  • カスタムスクロールバーの動作

この記事は、著者が実際のプロジェクトで遭遇したいくつかの事柄をまとめたものであり、主に次の内容が含まれます。

  1. ルーティングパラメータの変更への対応
  2. ルートマッチング
  3. 高度なマッチングモード
  4. マッチングの優先順位
  5. プッシュと置換の2番目と3番目のパラメータ
  6. ルーティングビュー
  7. リダイレクト
  8. $route と props の分離
  9. ナビゲーションガード
  10. ガードの次の方法

この記事がお役に立てば幸いです。

文章

1. ルーティングパラメータの変更に対応する

再利用されたコンポーネント (ルーティング パラメータのみが変更された) の場合、ライフサイクル関数フックは呼び出されません。コンポーネントを更新するにはどうすればよいですか?

時計

時計:
  '$route' (to、from) {
  // ルートの変更に応答します...
  }
}

ルート更新前

beforeRouteUpdate (to、from、next) {
// ルートの変更に反応します...
// next() を忘れずに呼び出してください
}

2. ルートマッチング

{
// すべてのパスに一致します パス: '*'
}
{
// `/user-` で始まるパスに一致します。パス: '/user-*'
}

注: ワイルドカード ルートを使用する場合は、ルートの順序が正しいことを確認してください。つまり、ワイルドカードを含むルートは最後に配置する必要があります。ルート { path: '*' } は通常、クライアント側の 404 エラーに使用されます。

履歴モードを使用する場合は、サーバーが正しく設定されていることを確認してください。

ワイルドカードを使用すると、pathMatch というパラメータが $route.params に自動的に追加されます。

ワイルドカードに一致する URL の部分が含まれます。

//ルートが指定されている場合 { path: '/user-*' }
this.$router.push('/user-admin')
this.$route.params.pathMatch // 'admin'
//ルートが指定されている場合 { path: '*' }
this.$router.push('/存在しない')
this.$route.params.pathMatch // '/存在しない'

3. 高度なマッチングモード

// 名前付きパラメータは「単一の文字」で構成されている必要があります [A-Za-z09] // ?オプション パラメータ { パス: '/optional-params/:foo?' }
// ルーティングは foo パラメータを設定することも設定しないこともでき、オプションです <router-link to="/optional-params">/optional-params</router-link>
<router-link to="/optional-params/foo">/optional-params/foo</router-link>
 
// 0 個以上のパラメータ { パス: '/optional-params/*' }
<router-link to="/number">パラメータなし</router-link>
<router-link to="/number/foo000">パラメータ</router-link>
<router-link to="/number/foo111/fff222">複数のパラメータ</router-link>
 
 
// 1 つ以上のパラメータ { path: '/optional-params/:foo+' }
<router-link to="/number/foo">パラメータ</router-link>
<router-link to="/number/foo/foo111/fff222">複数のパラメータ</router-link>
 
// カスタムマッチングパラメータ // すべてのパラメータにカスタム正規表現を指定することができます。これはデフォルト ([^\/]+) を上書きします。
{ パス: '/optional-params/:id(\\d+)' }
{ パス: '/optional-params/(foo/)?bar' }

4. マッチングの優先順位

場合によっては、パスが複数のルートと一致することがあります。

この時点で、一致する優先順位はルートが定義されている順序に基づきます。つまり、最初に定義されたルートの優先順位が最も高くなります。

5. pushとreplaceの2番目と3番目のパラメータ

バージョン 2.2.0 以降では、router.push または router.replace の 2 番目と 3 番目の引数として、onComplete コールバックと onAbort コールバックをオプションで提供できます。

これらのコールバックは、ナビゲーションが正常に完了したとき (すべての非同期フックが解決された後)、または終了したとき (同じルートに移動したとき、または現在のナビゲーションが完了する前に別のルートに移動したとき) に呼び出されます。 3.1.0 以降では、2 番目と 3 番目のパラメータを省略でき、Promise がサポートされている場合は router.push または router.replace は Promise を返します。

次に、2 番目と 3 番目のパラメータがいつ呼び出されるかを確認するためのいくつかの例を見てみましょう。

1. コンポーネント1がコンポーネント2にジャンプする

// コンポーネント 1
this.$router.push({ name: 'number' }, () => {
  console.log('コンポーネント1: onCompleteコールバック');
}, () => {
  console.log('コンポーネント1: onAbortコールバック');
});
// コンポーネント 2
beforeRouteEnter(to, from, next) {
  console.log('コンポーネント2: beforeRouteEnter');
  次();
},
作成前() {
  console.log('コンポーネント2: beforeCreate');
},
作成された() {
  console.log('コンポーネント2: 作成されました');
}

コンポーネント間を移動すると、onComplete コールバックがトリガーされます。

2. コンポーネント2はコンポーネント2にジャンプします(パラメータなし)

this.$router.push({ name: 'number'}, () => {
  console.log('コンポーネント2: onCompleteコールバック');
}, () => {
  console.log('コンポーネント2、自己ジャンプ: onAbortコールバック');
});

コンポーネントの自己ジャンプは、パラメータがない場合に onAbort コールバックをトリガーします。しかし、自己ジャンプがパラメータを取る場合、状況は少し異なる可能性があります。

3. コンポーネント2がコンポーネント2にジャンプする(パラメータ付き)

this.$router.push({ name: 'number', params: { foo: this.number}}, () => {
    console.log('コンポーネント2: onCompleteコールバック');
}, () => {
    console.log('コンポーネント2、自己ジャンプ: onAbortコールバック');
});

コンポーネント自体はパラメータでジャンプし、onComplete コールバックも onAbort コールバックもトリガーされません。

6. ルーティングビュー

複数のビューをネストするのではなく、同時に(同じレベルで)表示したい場合があります。たとえば、サイドバー(サイドナビゲーション)とメイン(メインコンテンツ)の 2 つのビューを含むレイアウトを作成する場合は、名前付きビューが便利です。

単一のアウトレットを使用する代わりに、インターフェイス内に個別に名前が付けられた複数のビューを持つことができます。

ルータ ビューに名前が付けられていない場合は、デフォルトになります。

<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>

ビューはコンポーネントを使用してレンダリングされるため、同じルートの場合、複数のビューには複数のコンポーネントが必要になります。

コンポーネント構成を正しく使用していることを確認してください (s を使用)。

const ルーター = 新しい VueRouter({
ルート: [
  {
    パス: '/'、
    コンポーネント:
        デフォルト: Foo、
        a: バー、
        b: バズ
    }
    }
  ]
});

7. リダイレクト

{ パス: '/a'、リダイレクト: '/b' }
{ パス: '/a'、リダイレクト: { 名前: 'foo' }}
{ パス: '/a'、リダイレクト先: => {
  // メソッドはターゲットルートをパラメータとして受け取り、// リダイレクトされた文字列パス/パスオブジェクトを返します }}

注: ナビゲーション ガードはリダイレクト ルートには適用されず、ターゲットにのみ適用されます。

上記の例では、/a ルートに beforeEach または beforeLeave ガードを追加しても効果はありません。

8. $route と props の分離

コンポーネントで $route を使用すると、対応するルートとの結合度が高くなり、コンポーネントは特定の URL でのみ使用可能になり、柔軟性が制限されます。

// ルーター ファイル // 名前付きビューを含むルートの場合は、名前付きビューごとに `props` オプションを個別に追加する必要があります。
{
  パス: '/number/:name',
  プロパティ: true、
  // オブジェクト モードのプロパティ: {newsletterPopup: false }
  // 関数モードのプロパティ: (route) => ({ query: route.parmas.name })
  名前: '番号',
  コンポーネント: () => import( /* webpackChunkName: "number" */ './views/Number.vue')
}
//コンポーネントはエクスポートのデフォルトを取得します{
  プロパティ: ['名前']
}

9. ナビゲーションガード

1. 3つのグローバルガード

router.before ルートに入る前の各グローバル フロント ガード。

router.beforeResolve グローバル解決ガード 2.5.0 が追加されました。 beforeRouteEnter が呼び出された後に呼び出されます。

router.after各グローバル post-hook がルートに入ります。

//エントリファイルimport router from './router'
 
// グローバルフロントガード router.beforeEach((to, from, next) => {
console.log('beforeEach グローバル フロント ガード');
次();
});
// グローバル解決ガード router.beforeResolve((to, from, next) => {
console.log('beforeResolve グローバル解決ガード');
次();
});
// グローバルポストガード router.afterEach((to, from) => {
console.log('afterEach グローバル ポスト ガード');
});

2. ルーター専用ガード

ルートに入る前にグローバルフロントガードに入ります。

{
  パス: '/number/:name',
  プロパティ: true、
  名前: '番号',
  // ルーティング排他ガード beforeEnter: (to, from, next) => {
      console.log('beforeEnterルート排他ガード');
      次();
  },
  コンポーネント: () => import( /* webpackChunkName: "number" */ './views/Number.vue')
}

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

ルートに入る前

beforeRouteUpdate (2.2 の新機能)

ルート出発前

beforeRouteEnter(to, from, next) {
  // このコンポーネントをレンダリングする対応するルートが確認される前に呼び出されます // いいえ!できる!コンポーネントインスタンス `this` を取得します。
  //ガードが実行される前にコンポーネント インスタンスが作成されていないため、console.log('beforeRouteEnter コンポーネントがガードに入る');
  次();
},
ルート更新前(to、from、next) {
  // 現在のルートが変更されたがコンポーネントが再利用されたときに呼び出されます // たとえば、動的パラメータを持つパス /foo/:id の場合、/foo/1 と /foo/2 の間を移動すると、
  // 同じ Foo コンポーネントがレンダリングされるため、コンポーネント インスタンスが再利用されます。この場合、このフックが呼び出されます。
  // コンポーネントインスタンス `this` にアクセスできます
  console.log('beforeRouteUpdate コンポーネント更新ガード');
  次();
},
beforeRouteLeave(to, from, next) {
  // このコンポーネントの対応するルートから移動するときに呼び出されます // コンポーネントインスタンス `this` にアクセスできます
  console.log('beforeRouteLeave コンポーネントがガードから出る');
  次();
}

コンポーネント1はコンポーネント2にジャンプし、次にコンポーネント2はコンポーネント2自体にジャンプします。

コンポーネント1はコンポーネント2にジャンプし、次にコンポーネント2はコンポーネント1にジャンプします。

10. ガードネクストメソッド

next: このメソッドは、resolve フックを呼び出します。

  • next(): パイプラインの次のフックに進みます。すべてのフックが実行されると、ナビゲーションステータスが確定します。
  • next(false): 現在のナビゲーションを中断します。ブラウザの URL が変更された場合 (ユーザーが手動で変更するか、ブラウザの戻るボタンを押して変更した場合)、URL アドレスは from ルートに対応するアドレスにリセットされます。
  • next('/') または next({ path: '/' }): 別のアドレスにジャンプします。現在のナビゲーションが中断され、新しいナビゲーションが実行されます。任意の場所オブジェクトを next に渡すことができ、これにより、replace: true、name: 'home' などのオプションや、router-link または router.push の to プロパティで使用されるオプションを設定できます。
  • next(error): (2.4.0+) next に渡された引数が Error インスタンスの場合、ナビゲーションは中止され、エラーは router.onError() に登録されたコールバックに渡されます。

やっと

最後に、バグを避けるために、プロジェクトで使用する前に、ドキュメントを注意深く読んで理解していただければ幸いです。ありがとうございます。

これで、Vue Router の 10 の高度なヒントに関するこの記事は終了です。Vue Router のより高度なヒントについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueプロジェクトでlessを使用するためのヒント
  • 22 Vue 最適化のヒント (プロジェクトの実践)
  • Vue.js パフォーマンス最適化 N 個のヒント (収集する価値あり)
  • Vueプロジェクトでよく使われる実践的なスキルのまとめ
  • 読めばわかるVueの8つのヒント
  • Vue 要素と Nuxt の使用に関するヒントを共有する
  • Vue 開発における一般的なルーチンとテクニックの概要
  • Vue関数コンポーネントの使用に関する簡単な説明
  • Vue.js でより良い v-for ループを書くための 6 つのヒント
  • 知っておくべき 25 の Vue のヒント

<<:  mysql 起動時の ERROR 2003 (HY000) の問題を解決する方法

>>:  LinuxベースのLVMシームレスディスク水平拡張の詳細な説明

推薦する

MySQL の完全バックアップとクイックリカバリ方法

過去 15 日間のデータをバックアップするシンプルな MySQL 完全バックアップ スクリプト。バッ...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

CSS background-blend-modeの仕組みを深く理解する

この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...

ウェブデザイナーは適した人材

<br />この世に道はない。より多くの人が歩くようになると、それは道になります。最初は...

よく理解しましたかタグ 定義方法 使用方法

序文:今日、「<!DOCTYPE> タグを注意深く理解しましたか?」と尋ねられました。私...

CSS3 は 3D キューブの読み込み効果を作成します

簡単な説明これは CSS3 のクールな 3D キューブのプリロード効果です。この特殊効果は、シンプル...

IDEA の Maven プロジェクトで MySQL 8.0 に接続して使用する方法に関するチュートリアル

まず、私の基本的な開発環境を見てみましょう。オペレーティングシステム: MacOS 10.13.5 ...

Mysql接続数の設定と取得方法

接続数を取得する --- 最大接続数を取得します。SHOW VARIABLES LIKE '...

auto.jsを使用して毎日の自動チェックイン機能を実現する

auto.js を使用して毎日のチェックインを自動化する感染症のせいで、毎日時間通りに家に帰らなけれ...

Douyin ロゴを作成する手順の CSS3 分析

「Tik Tok」も大人気で、ユーザー数は7億人と言われています。今日は、注目を集めるためにTikT...

Nginxの仕組みの詳細な説明

Nginxの仕組みNginx はコアとモジュールで構成されています。 Nginx 自体は実際にはほと...

CentOS7でPHPスケジュールタスクを実行する方法

序文この記事は主に CentOS7 で PHP スケジュールタスクを実行することに関する関連コンテン...

ページ内の検索エンジンの呼び出しはBaiduを例に挙げています

今日、突然、自分のウェブページで Google や Baidu のような強力な検索エンジンを呼び出す...

一目でわかる$nextTickの説明

目次1. 機能説明2. 親コンポーネント3. サブコンポーネント NextTick.vue 4なぜ未...