非常に詳細な 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 を使用する際の落とし穴の概要

推薦する

MySQLで指定した時間前にレコードを自動的に削除する方法

イベントについて: MySQL 5.1 では、イベントの概念が導入され始めました。イベントは「時間ト...

jsオブジェクトの読み取り速度の詳細な例

1. リテラルとローカル変数へのアクセスは最も高速ですが、配列要素とオブジェクト メンバーへのアクセ...

Google Recaptcha 認証を使用した Vue 実装例

最近のプロジェクトでは、Google ロボット認証を使用する必要があります。これには VPN が必要...

Redission-tomcatは、単一マシンから複数マシンへの展開を迅速に実装します。

序文一部のプロジェクトの初期段階では、シンプルさとスピードのために、開発と展開は単一のマシンで行われ...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...

Elementのメッセージポップアップウィンドウが繰り返しポップアップする問題の解決

目次1. 使用2. メッセージポップアップウィンドウが繰り返し表示される問題を解決する1. 使用Vu...

Dockerfile に基づいて Tomcat イメージを構築する方法

Dockerfile は Docker イメージを構築するために使用されるファイルです。コマンドパラ...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

MySQLにおけるrow_numberの実装プロセス

1. 背景一般的に、データ ウェアハウス環境では、row_number 関数を使用して特定のディメン...

JS は VUE コンポーネントに基づいて都市リスト効果を実装します

この記事の例では、VUEコンポーネントに基づいて都市リストエフェクトを実装するための具体的なコードを...

Reactは二次連結(左右連結)を実現する

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...

JSONデータをHTMLで表示する方法

背景:場合によっては、json データをページに直接表示する必要があります (たとえば、インターフェ...

データ型の判断における js typeof と instanceof の違いと、その開発と使用について

目次1. typeof演算子2. インスタンスオブ演算子3. typeof と instanceof...

JavaScript は最大値と最小値のアルゴリズムを通じて AI 三目並べゲームを実装します

では、早速スクリーンショットを実行してみましょう。黒い駒はプレイヤーの位置、赤い駒はコンピュータの位...

CnBlogs カスタムブログスタイルの共有

半夜かけてようやくブログのスタイルを大体完成させることができました。ブログ全体が青を基調としていて、...