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 マスタースレーブ同期 Last_IO_Errno:1236 エラー解決

Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...

Windows で MySQL インストーラーを使用して MySQL サービスをインストールするチュートリアル図

MYSQL は、MYSQL サービスやその他のコンポーネントをインストールするためのインストーラ方式...

MySQLは現在の日付と時刻を取得する関数の例の詳細な説明

現在の日付 + 時刻 (日付 + 時刻) を取得する関数: now() mysql> now(...

HTML で色を表すには、6 桁の 16 進コード、RGB、またはキーワードを使用します。

HTML で色を表す方法は 3 つありますが、最もよく使われるのは 6 桁の 16 進コード表現です...

要素テーブルテーブルコンポーネントの複数フィールド(複数列)ソート方法

目次必要:発生した問題:解決する:必要:要素テーブル内の複数の列を並べ替えるには、日付の並べ替えをク...

Dockerコンテナのデータを復元する方法

プロジェクトのテスト環境データベースのデータが失われてしまったので、記録しておきたいと思います。当時...

JavaScript における継承の 3 つの方法

継承する1. 継承とは何か継承: まず、継承とは関係、つまりクラス間の関係です。JS にはクラスはあ...

Linux システムで jmeter を実行し、ローカル メモリを最適化する方法の詳細な説明

1. Linuxシステムにクロスシステムファイル転送ツールをインストールするルートユーザーのルートデ...

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

vue2.x の徹底研究 - h 関数の説明

目次解決、要約: vue プロジェクト。 .vue ファイルのテンプレート内に記述されたコードは、w...

XHTML 入門チュートリアル: フレーム タグの使用

<br />フレーム構造により、ブラウザの 1 ページに複数の Web ページを同時に表...

Linux で ss コマンドと zabbix を組み合わせてソケットを監視する方法の詳細な説明

目次序文1. ssコマンド2. Zabbix監視マシンの全体的なソケットステータス2.1. スクリプ...

CentOS 7 で yum を使用して MySQL 5.7.20 をインストールする最も簡単な方法

CentOS7 のデフォルトのデータベースは mariadb ですが、mysql を使っている人も多...

Zabbixで監視する必要があるホストを追加するための詳細な手順

監視ホストの追加ホスト 192.168.179.104 が zabbix 監視項目に追加されます (...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...