非常に詳細な Vue-Router のステップバイステップのチュートリアル

非常に詳細な Vue-Router のステップバイステップのチュートリアル

最近、vue ファミリー全体を見直しています。改めて読んでみるとより深く思い出せる気がしたので、特別に記録に残しました (この記事の vue-router のバージョンは v3.x です)。

1. ルータビュー

<router-view> は、パスに一致するビュー コンポーネントをレンダリングするために使用される機能コンポーネントです。 <transition> および <keep-alive> と一緒に使用できます。両方を一緒に使用する場合は、必ず内部で <keep-alive> を使用してください。

<ルータービュー></ルータービュー>
<!--または-->
<ルータービュー名="フッター"></ルータービュー>

<router-view> に名前が設定されている場合、対応するルーティング構成内のコンポーネントの下の対応するコンポーネントがレンダリングされます。

2. ルータリンク

<router-link> タグは、ルーティング機能を備えたアプリケーションでのユーザー (クリック) ナビゲーションをサポートします。

財産タイプ例示する
文字列/オブジェクトターゲットルート/ロケーションオブジェクト
交換するブールナビゲーション履歴が残っていません
追加ブール現在のパスの後にパス /a => /a/b を追加します。
タグレンダリングするラベルを指定します
アクティブクラスアクティベーション中に使用されるクラス
<router-link :to="{ path: '/login'}" を tag="span" に置き換えます></router-link>

3. リダイレクト

ルートルートはログインにリダイレクトします

const ルーター = 新しい VueRouter({
  ルート: [
    { パス: '/'、リダイレクト: '/login' }
  ]
})

リダイレクトターゲットを動的に返す

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

4. ルーティングエイリアス

ルートが/bにアクセスすると、URLは/bのままですが、ルートマッチは/aになります。

const ルーター = 新しい VueRouter({
  ルート: [
    { パス: '/a'、コンポーネント: A、エイリアス: '/b' }
  ]
})

5. ルーティングプロップ

$routeとの過剰な結合を避けるためにpropsを使用し、propsを使用してコンポーネント内で直接パラメータを受け取ることができるようにします。

5.1、ブールモード

ルートの後にパラメータを記述し、propsをtrueに設定します

{
 パス: '/vuex/:id',
 名前: 'Vuex'、
 コンポーネント: () => import('@/view/vuex'),
 プロパティ: true、
 メイト:
  タイトル: 'vuex'
 }
}

ジャンプに渡す必要のあるパラメータを設定する

<router-link :to="{name:'Vuex', params: {id: '99999'}}" tag="h1">ジャンプ</router-link>
<!--または-->
トゥネクスト() {
    this.$router.push({
     名前: 'Vuex'、
     パラメータ: {
      id: '99999'
     }
    })
}

ジャンプ先のページでは、propsまたはthis.$paramsを使用してパラメータを取得します。

小道具: {
 id: {
  タイプ: 文字列、
  デフォルト: ''
 }
}
<!--または-->
this.$params.id

5.2 オブジェクトモード

静的データを運ぶためにルート内のオブジェクトとしてpropsを設定する

{
 パス: '/vuex',
 名前: 'Vuex'、
 コンポーネント: () => import('@/view/vuex'),
 小道具: {
  id: '99999'
 },
 メイト:
  タイトル: 'vuex'
 }
}

ジャンプ

<router-link :to="{name:'Vuex'}" tag="h1">ジャンプ</router-link>
<!--または-->
トゥネクスト() {
 this.$router.push({
  名前: 'Vuex'
 })
}

ジャンプ先のページでは、propsまたはthis.$paramsを使用してパラメータを取得します。

小道具: {
 id: {
  タイプ: 文字列、
  デフォルト: ''
 }
}
<!--または-->
this.$params.id

注: 静的データにのみ適用されます

5.3、機能モード

まずルート内の Function に props を設定し、オブジェクトを返します。クエリでもパラメータでも、props に変換できます。

{
 パス: '/vuex',
 名前: 'Vuex'、
 コンポーネント: () => import('@/view/vuex'),
 プロパティ: ルート => ({
     <!--クエリ-->
  id: ルート.クエリ.id、
  <!--パラメータ-->
  年齢: route.params.age
 })、
 メイト:
  タイトル: 'vuex'
 }
}

ジャンプ

<router-link :to="{name:'Vuex',query: {id: '99999'}, params:{age:'20'}}" tag="h1">ジャンプ</router-link>
<!--または-->
トゥネクスト() {
 this.$router.push({
  名前: 'Vuex'、
  クエリ: {
   id: '999999'
  },
  パラメータ: {
   年齢: '20'
  }
 })
}

ジャンプ先のページで、props または this.$route.params / this.$route.query を通じてパラメータを取得します。

小道具: {
 id: {
  タイプ: 文字列、
  デフォルト: ''
 },
 年: {
  タイプ: 文字列、
  デフォルト: ''
 }
}
<!--または-->
this.$route.query
this.$route.params

6. ルーティングガード

ルート ガードは主に、リダイレクトまたはキャンセルによってナビゲーションを保護するために使用されます。

6.1、グローバル事前ガードbeforeEach

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

パラメータ例示する
入力するターゲットルートオブジェクト
から現在のナビゲーションがこれから出発するルート
コールバックメソッド

nextの使い方は以下のとおりです

文法例示する
次()次のフックに進む
次へ(偽)ナビゲーションを中断します。URL が変更されている場合は、送信元アドレスにリセットします。
次('/')現在のジャンプを中断して別のアドレスに移動します。ルーティングオブジェクトを設定できます
次へ(エラー)ナビゲーションが終了し、エラーがonError()に渡されます。
const ルーター = 新しい VueRouter({...})

router.beforeEach((to, from, next) => {
  // ...
})

6.2、グローバル解決ガード beforeResolve

2.5.0 の新機能。beforeEach に似ていますが、解析ガードはナビゲーションが確認される前、コンポーネントと非同期ルーティング コンポーネント内のすべてのガードが解析された後に呼び出される点が異なります。

router.eforeResolve((to, from, next) => {
  // ...
})

6.3、グローバルポストフック afterEach

ポストガードは次の関数を受け入れず、ナビゲーション自体を変更しません。

router.afterEach((to, from) => {
  // ...
})

6.4、ルータの排他ガードbeforeEnter

グローバル before ガードと同じメソッド パラメータを使用して、ルート構成で独自の beforeEnter ガードを直接定義できます。

const ルーター = 新しい VueRouter({
  ルート: [
    {
      パス: '/foo',
      コンポーネント: Foo、
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

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

  • ルートに入る前

ナビゲーションが確定する前にガードが呼び出されるため、ガードはこれにアクセスできず、表示される新しいコンポーネントはまだ作成されていません。コールバックを next に渡すことで、コンポーネント インスタンスにアクセスできます。ナビゲーションが確定するとコールバックが実行され、コンポーネント インスタンスがコールバック メソッドのパラメーターとして使用されます。

const フッター = {
  テンプレート: `...`,
  beforeRouteEnter(to, from, next) {
    次(vm => {
        // `vm` 経由でコンポーネントインスタンスにアクセスします})
  }
}
  • beforeRouteUpdate (2.2 の新機能)

現在のルートが変更されたがコンポーネントが再利用されるときに呼び出され、これを使用してコンポーネント インスタンスにアクセスできます。

定数Foo = {
  テンプレート: `...`,
  ルート更新前(to、from、next) {
    this.name = to.params.name
    次()
  }
}
  • ルート出発前

このコンポーネントの対応するルートから移動するときに呼び出されます。通常、変更を保存する前にユーザーが突然離れるのを防ぐために使用されます。 next(false) を呼び出すことでキャンセルできます。

定数Foo = {
  テンプレート: `...`,
  beforeRouteLeave(to, from, next) {
    const answer = window.confirm('本当に終了してもよろしいですか?')
    (答え)の場合{
        次()
    } それ以外 {
        次へ(偽)
    }
  }
}

6.6、ナビゲーション分析プロセスを完了する

  1. ナビゲーションが起動します。
  2. 非アクティブ化されたコンポーネントで beforeRouteLeave ガードを呼び出します。
  3. グローバル beforeEach ガードを呼び出します。
  4. 再利用されたコンポーネントで beforeRouteUpdate ガードを呼び出します (2.2 以降)。
  5. ルーティング構成で beforeEnter を呼び出します。
  6. 非同期ルーティング コンポーネントを解決します。
  7. アクティブ化されたコンポーネントで beforeRouteEnter を呼び出します。
  8. グローバル beforeResolve ガード (2.5 以降) を呼び出します。
  9. ナビゲーションが確認されました。
  10. グローバル afterEach フックを呼び出します。
  11. DOM 更新をトリガーします。
  12. beforeRouteEnter ガード内の next に渡されたコールバック関数を呼び出すと、作成されたコンポーネント インスタンスがコールバック関数のパラメーターとして渡されます。

7. ルーティングメタ情報

ルートを定義するときに、各ルートに対応する情報を格納するようにメタ オブジェクト フィールドを構成できます。 this.$route.meta 経由でアクセスするか、ルートガード内の to.meta および from.meta 経由でアクセスします。

const ルーター = 新しい VueRouter({
  ルート: [
    {
  パス: '/index',
  名前: 'インデックス'、
  コンポーネント: () => import('@/view/index'),
  メタ: {
   タイトル: 'ホームページ'、
   rolu: ['管理者', 'ボス']
  }
 }
  ]
})

8. トランジション効果

router-view タグを transition タグで囲むだけです。アニメーション効果は自分で定義できます。 transition コンポーネントの使用方法を参照してください。また、親コンポーネントまたは app.js で watch を使用して $route の変更を監視し、さまざまなルートに応じて遷移コンポーネントの name 属性を置き換え、さまざまなアニメーション効果を実現することもできます。

<トランジション:name="トランジション名">
  <ルータービュー></ルータービュー>
</トランジション>

モニター

時計:
  '$route' (to、from) {
    定数 toD = to.path.split('/').length
    定数 fromD = from.path.split('/').length
    this.transitionName = toD < fromD ? 'slide-right' : 'slide-left'
  }
}

9. スクロール動作

Router インスタンスを作成するときに、scrollBehavior メソッドを提供し、ルート オブジェクトとの間で送受信を行うことができます。 3 番目のパラメータ savedPosition は、ブラウザの進む/戻るボタンによってトリガーされた場合にのみ使用できます。

const ルーター = 新しい VueRouter({
 モード: 'ハッシュ'、
 ルート、
 scrollBehavior(to, from, savedPosition) {
  if (保存された位置) {
   新しい Promise を返します ((resolve, reject) => {
    タイムアウトを設定する(() => {
     解決(保存された位置)
    }, 1000)
   })
  } それ以外 {
   戻り値: { x: 0, y: 0 }
  }
 }
})

10. ルーティング構成を完了する

まず Vue と vue-router をインポートし、次に router を使用してルーティング情報のセットを定義します。各ルートは、次のプロパティを持つオブジェクトです。

財産タイプ価値
パスコンポーネントパス情報
名前コンポーネントの命名
成分関数コンポーネント
メイト物体メタ情報
子供たち物体サブルーティング
リダイレクトリダイレクト
小道具ブール/オブジェクト/関数パラメータの受け渡し

具体的なコードは次のとおりです。

'vue' から Vue をインポートします
'vue-router' から VueRouter をインポートします。
Vue.use(VueRouter)

定数ルート = [
 {
  パス: '/'、
  リダイレクト: '/index'
 },
 {
  パス: '/index',
  名前: 'インデックス'、
  コンポーネント: () => import(/* webpackChunkName: "index" */ '@/view/index'),
  メイト:
   タイトル: 'ホームページ'、
   認証: 偽
  }
 },
 {
  パス: '/login',
  名前: 'ログイン',
  コンポーネント: () => import(/* webpackChunkName: "login" */ '@/view/login'),
  メタ: {
   タイトル: 「ログイン」
   認証: 偽
  },
  子供たち: [
   {
    パス: 'children',
    名前: 「子供」
    コンポーネント: () => import(/* webpackChunkName: "children" */ '@/view/children'),
    メイト:
     タイトル: 「ネストされたサブルート」
     認証: 偽
    }
   }
  ]
 }
]

const ルーター = 新しい VueRouter({
 モード: 'ハッシュ'、
 ルート
})

デフォルトルーターをエクスポートする

注意: ネストされたサブルートは、ネストされたページの <router-view> タグ内に配置する必要があります。

要約する

これで、Vue-Router チュートリアルに関するこの記事は終了です。Vue-Router のステップバイステップのチュートリアルに関する関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vue3+TypeScript+vue-routerの使い方
  • Vue-router ネストルーティングの詳細な説明
  • vue-router 4 の使用例の詳しい説明
  • Vue-Routerのルート設定の詳しい説明
  • バックエンドの権限に基づいてナビゲーション メニューを動的に生成する Vue-router のサンプル コード
  • Vue-Routerのインストールプロセスと原理の詳細
  • Vue-Routerのインストールと使用方法の詳細な説明
  • vue3 で vue-router を使用するための完全な手順
  • Vue ルーター vue-router 詳細説明ガイド
  • Vue-routerルーティングの使い方
  • Vue ルーティング vue-router の使用方法の説明

<<:  Linux echo テキスト処理コマンドの使用法と例

>>:  MySQL で主キーと ROWID を使用する際の落とし穴の概要

推薦する

モバイル アプリのユーザー インターフェース設計に関する 10 のヒント

ヒント1: 集中力を保つ最高のモバイル アプリは、1 つのことを非常にうまく行うことに重点を置いてい...

JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)

導入:スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 1 つ作成しようと思い、...

3つの簡単な例を使ってハイパーリンクの下線を削除する方法

ハイパーリンクの下線を削除するには、スタイルシート CSS を使用する必要があります。当面は CSS...

Tencent Cloudでhive3.1.2を構築する方法を教えます

環境の準備操作を開始する前に、hadoop バージョンがインストールされていることを確認してください...

JSメモリ空間の詳細な説明

目次概要1. スタックとヒープ2. 変数オブジェクトと基本データ型3. 参照データ型とヒープメモリメ...

MySQLオンラインログライブラリの移行例

最近の事例をお話ししましょう。オンライン Alibaba Cloud RDS 上のゲーム ログ ライ...

JS 実用的なオブジェクト指向スネークゲームの例

目次考える1. 貪欲な蛇の効果画像2. スネークの分析2.1 ゲーム開始機能2.2 運動機能2.2....

MySQLのconcat関連関数の詳細な説明

1. concat() 関数機能: 複数の文字列を 1 つの文字列に連結する構文: concat(s...

InnoDB ロック (レコード、ギャップ、Next-Key ロック) の詳細な説明

レコード ロックは、単一のインデックス レコードをロックします。レコード ロックは常にインデックスを...

Docker環境を構築する簡単な方法

まず、Docker とは何かを理解しましょう。 Docker は、アプリケーションをデプロイするため...

CSSカスケーディングメカニズムについての簡単な説明

CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...

forEachでawaitが機能しない問題を解決する

1. はじめに数日前、プロジェクトでトラバーサルに使用したときに落とし穴に遭遇し、解決するのに 1 ...

MySQL インポート csv エラーの 4 つの解決策

これは今日私が踏んだ4つの落とし穴を記念したものです...落とし穴1:地元のせいエラー:エラー 39...

Nginx イントラネット スタンドアロン リバース プロキシの実装

目次1 Nginxのインストール2 Nginxの設定3 ホストファイルを変更する4 テストNginx...

Centos8 でローカル Web サーバーを構築するための実装手順

1 概要システム Centos8 では、httpd を使用してローカル Web サーバーを構築します...