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シームレスディスク水平拡張の詳細な説明

推薦する

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

DockerはRedisを起動し、パスワードを設定します

RedisはRedisバージョン5のapline(Alps)イメージを使用します。これは小さくて高速...

怖いハロウィーン Linux コマンド

ハロウィーンではありませんが、Linux の不気味な側面に注目する価値はあります。幽霊、魔女、ゾンビ...

MySQLデータベースの増分バックアップのアイデアと方法

MySQL データベースの増分バックアップを実行するには、データベース構成ファイル /etc/my....

Webデザインと制作のテスト問題と参考回答

<br />Web デザインと制作テスト パート I 多肢選択問題 1. 単一選択問題 ...

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具...

WeChatアプレットがシンプルな計算機機能を実装

WeChatアプレット:シンプルな計算機、参考までに、具体的な内容は次のとおりです。ミニプログラムに...

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...

MySQL 8.0.22 winx64 のインストールと設定のグラフィックチュートリアル

mysql 8.0.22 winx64のインストールと設定のグラフィックチュートリアルは参考までに、...

VMware esxi6.5 のインストールと使用の詳細な手順

目次導入建築ESXIの利点vSphere とは何ですか? 2. 仮想マシンの利点3. 仮想マシンを使...

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

要素内の TimePicker は時間の一部を無効にします (分単位で無効)

プロジェクトの要件は、日付と時刻を選択し、現在の時刻以降の時刻のみを選択し、最小レベルを分単位で無効...

HTML テーブル マークアップ チュートリアル (6): 暗い境界線の色属性 BORDERCOLORDARK

表では、右下の境界線の色を個別に定義したり、セルの左上の境界線の色を定義したりできます。これら 2 ...

Tomcat が応答データグラムを書き戻すタイミングの詳細な分析

疑問が生じるこの質問は、ファイルのダウンロードを記述しているときに発生しました。HttpServle...

面接官はReactのライフサイクルについてよく質問します

ReactライフサイクルReactのライフサイクルを理解するのに役立つ2つの図React ライフサイ...