VueRouterルーティングの詳細な説明

VueRouterルーティングの詳細な説明

vueルーター

1. ルーティングの概念を理解する

1.1 ルーティングとは何ですか?

相互接続されたネットワークを介して送信元アドレスから宛先アドレスに情報を転送するアクティビティ。

1.2. バックエンドルーティングステージ

ウェブサイト開発の初期には、HTML ページ全体がサーバーによってレンダリングされていました。
サーバーは対応する HTML ページを直接生成してレンダリングし、クライアントに返して表示します。
しかし、Web サイトはどのようにしてこれほど多くのページ サーバーを処理するのでしょうか?
ページには、対応する独自の Web アドレス、つまり URL があります。
URL はサーバーに送信され、サーバーは URL を正規表現と照合し、最終的に処理のためにコントローラーに渡します。
コントローラーはさまざまな処理を実行し、最終的に HTML やデータを生成してフロントエンドに返します。
これでIO操作が完了します。
上記の操作はバックエンドルーティングです。
ページ内で異なるパスのコンテンツをリクエストする必要がある場合、処理のためにサーバーに渡します。サーバーはページ全体をレンダリングし、ページをクライアントに返します。この場合、レンダリングされたページは js と css を個別にロードする必要がなく、表示のためにブラウザに直接渡すことができるため、SEO 最適化にも役立ちます。
バックエンドルーティングの欠点:
1 つの状況は、ページ モジュール全体がバックエンド担当者によって作成および保守される場合です。
もう 1 つの状況は、フロントエンド開発者がページを開発する場合、PHP や Java などの言語を使用してページ コードを記述する必要があることです。
そして通常、HTML コード、データ、および対応するロジックが混在しており、作成と保守が非常に困難です。

1.3. フロントエンドルーティングステージ

フロントエンドとバックエンドの分離段階:
Ajax の登場により、フロントエンドとバックエンドを分離した開発モデルが生まれました。
バックエンドはデータを返す API のみを提供し、フロントエンドは Ajax を介してデータを取得し、JavaScript を介してページにデータをレンダリングできます。
これの最大の利点は、フロントエンドとバックエンドの責任が明確であることです。バックエンドはデータに重点​​を置き、フロントエンドはインタラクションと視覚化に重点を置きます。
また、モバイル端末 (iOS/Android) が登場しても、バックエンドは処理を行う必要がなく、以前の API セットを引き続き使用できます。
多くのウェブサイトは今でもこのように開発されています。
シングルページのリッチアプリケーションステージ:
実際、SPA の主な特徴は、フロントエンドとバックエンドの分離に基づいてフロントエンド ルーティングのレイヤーを追加することです。
つまり、フロントエンドはルーティング ルールのセットを維持します。
フロントエンドルーティングの核となるものは何ですか?
URL は変更されますが、ページ全体は更新されません。
どうやってそれを達成するのでしょうか?

1.4. フロントエンドレンダリングとバックエンドレンダリング?

フロントエンド レンダリング: サーバーは対応する HTML ページを直接生成してレンダリングし、クライアントに返して表示します。例: jspページ

ここに画像の説明を挿入

バックエンド レンダリング: バックエンドは JSON データを返し、フロントエンドは事前に記述された HTML テンプレートを使用して JSON データをループし、文字列を連結してページに挿入します。

ここに画像の説明を挿入

2. フロントエンドルーティングルール

2.1. URLハッシュ

場所の説明

ここに画像の説明を挿入

location.href効果によりページ全体が更新されます

画像の説明を追加してください

location.hash の完全更新ではなく部分更新

画像の説明を追加してください

2.2. HTML5 履歴モード

  • pushState バックスタック構造

機能: 先入れ後出し pushState: スタックにプッシュ back: スタックからポップアウト

効果は以下のとおりです

  • 状態を戻す

後戻りはできない

  • 行く

history.go(-1) 1ステップ戻る
history.go(1) <=> history.forward() 1ステップ進む

3. ルートビューの基本

3.1 vue-routerを理解する

  • vue-routerはコンポーネントとルーティングに基づいています

ルーティングは、アクセス パスを設定し、パスをコンポーネントにマップするために使用されます。
vue-router のシングルページアプリケーションでは、ページパスの変更はコンポーネントの切り替えになります。

3.2. vue-routerをインストールして使用する

  • webpackを使用してエンジニアリング開発を作成する
  • インストールnpm install vue-router --save
  • モジュール使用

ルーティングオブジェクトをインポートし、Vue.use(VueRouter) を呼び出します。

ルーティングインスタンスを作成し、ルーティングマップ構成を渡します

作成したルーティングインスタンスをvueインスタンスにマウントする

  • vue-routerステップの使用

ルーティングコンポーネントの作成

ルートマッピング、コンポーネント、パスマッピングの関係を構成する

.vueについて

<テンプレート>
  <div>
    <h2>私は</h2>
    <p>私はコンテンツが大事です、へへ</p>
  </div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    名前: 「概要」
  }
</スクリプト>

<スタイルスコープ>

</スタイル>

ホーム.vue

<テンプレート>
  <div>
    <h2>私はホームページです</h2>
    <p>私はホームページのコンテンツです、ハハハ</p>
  </div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    名前: 「ホーム」
  }
</スクリプト>

<スタイルスコープ>

</スタイル>

ルーター -> index.js

// VueRouterオブジェクトを作成する constroutes = [
    {
        パス: ''、
        <!--ルーティングのデフォルト値-->
        // デフォルトページはホームページリダイレクトに直接ロードされます: '/home'
    },
    {
        パス: '/home',
        コンポーネント: ホーム
    },
    {
        パス: '/about',
        コンポーネント: について
    },
]

const ルーター = 新しい VueRouter({
    //ルートとコンポーネントルート間のアプリケーション関係を設定します。
    モード:"履歴",
    リンクアクティブクラス:"アクティブ"
})

  • router-linkとrouter-viewを使用して表示する
<テンプレート>
  <div id="アプリ">
    <router-link to="/home">ホーム</router-link>
    <router-link to="about">について</router-link>
    <ルータービュー/>
  </div>
</テンプレート>

一般的なプロセス
1. 指示に従ってVueプロジェクトを作成する

vue 作成 vuerouterstudy

2. デフォルトで生成されたHelloWorldコンポーネント関連情報を削除する
3. ルーティングインスタンスを作成し、ルーティングマップ構成を渡す

ホーム.vue

<テンプレート>
    <div>
        私はホームページのコンテンツです</div>
</テンプレート>

インデックス

'vue-router' から VueRouter をインポートします。
'vue' から Vue をインポートします
'../components/Home' から Home をインポートします。

// 1. Vue.use(プラグイン名) 経由で Vue.use(VueRouter) プラグインをインストールします。

// 2. VueRouterオブジェクトを作成する constroutes = [
    {
        パス: '/home',
        コンポーネント: ホーム
    }
]

// 3. ルーティングとコンポーネント間のマッピング関係を構成する const router = new VueRouter({
    ルート
})

// 4. ルータオブジェクトをVueインスタンスに渡す export default router

ルートの使用
アプリ.vue

<テンプレート>
  <div id="アプリ">
    <!-- ハイパーリンクをレンダリングします -->
    <router-link to="/home" tag="button">ホーム</router-link>
    <router-link to="/about" tag="button">について</router-link>

    <!-- 動的レンダリング コンポーネント -->
    <ルータービュー></ルータービュー>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:「アプリ」、
  コンポーネント: {},
};
</スクリプト>

<スタイル>
</スタイル>

コンポーネントの簡単な説明

<router-link>: このタグはvue-routerの組み込みコンポーネントであり、最終的にはリンクをレンダリングします。<router-view>: このタグは、現在のパスに応じて、上部のタイトルナビゲーションや下部の著作権情報など、さまざまなコンポーネントWebページの他のコンテンツを動的にレンダリングします。同じ登録ルートが切り替えられると、スイッチは<router-view>によってマウントされたコンポーネントであり、他のコンテンツは変更されません。

最終レンダリング

ここに画像の説明を挿入

3.3. ルーティングのデフォルトパス

デフォルトでは、Web サイトのホームページにアクセスすると、<router-view> によってホームページのコンテンツがレンダリングされます。
ただし、私たちの実装では、ホームページ コンポーネントはデフォルトでは表示されず、ユーザーがクリックする必要があります。
パスをデフォルトでホームページにジャンプさせ、<router-view> でホームページ コンポーネントをレンダリングするにはどうすればよいですか?
とても簡単です。あと 1 つのマッピングを構成するだけです。

ここに画像の説明を挿入

構成解析

ルートに別のマッピングを構成しました。
パス構成はルートパスです: /
リダイレクトはリダイレクトです。つまり、ルート パスを /home のパスにリダイレクトして、必要な結果を得ることができます。

3.4. HTML5 履歴モード

デフォルトページはURLのハッシュモードです

ここに画像の説明を挿入

HTML5で履歴に変更したい場合は、次のように設定します。

ここに画像の説明を挿入


画像の説明を追加してください

3.5. ルータリンク補足

  • タグ属性: タグは後でレンダリングするコンポーネントを指定できます。たとえば、上記のコードは要素としてではなく、

ここに画像の説明を挿入

  • 置換属性: 置換は履歴を残さないので、置換が指定されている場合は戻るキーで前のページに戻ることはできません。

ここに画像の説明を挿入

  • Active-class 属性: 対応するルートが正常に一致すると、現在の要素に対して router-link-active クラスが自動的に設定されます。active-class を設定すると、デフォルト名を変更できます。

このクラスは、ナビゲーション メニューまたは下部のタブバーを強調表示するときに使用されます。
ただし、クラス属性は通常は変更されず、デフォルトの router-link-active が直接使用されます。

ここに画像の説明を挿入

このメソッドはルーティング設定のindex.jsでも使用できます。

3.6. ルーティングコードジャンプ

ソースコードの実装

<テンプレート>
  <div id="アプリ">
    <!-- ハイパーリンクをレンダリングします -->
    <!-- <router-link to="/home" tag="h1" replace>ホーム</router-link> -->
    <!-- <router-link to="/about" tag="h1" replace active-class>概要</router-link> -->
    <button @click="handleHome">ホーム</button>
    <button @click="handleAbout">について</button>
    <!-- 動的レンダリング コンポーネント -->
    <ルータービュー></ルータービュー>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:「アプリ」、
  コンポーネント: {},
  方法:{
    ハンドルホーム(){
      this.$router.push('/home')
    },
    ハンドルアバウト(){
      this.$router.push('/about')
    }
  }
};
</スクリプト>

<スタイル></スタイル>

レンダリング

画像の説明を追加してください

3.7 動的ルーティング

場合によっては、ページのパスが不確かなことがあります。たとえば、ユーザー インターフェイスに入るときに、次のパスが示されることを期待します。
/user/aaaa または /user/bbbb
先頭の/userに加えて、ユーザーのIDも続きます
パスとコンポーネント間のこの一致関係は、動的ルーティング(データ転送をルーティングする方法でもある)と呼ばれます。

1. 構成コンポーネントとパスのマッピング

//ルーティング関連情報を構成するimport Vue from 'vue'
「vue-router」からVueRouterをインポートします。

'../components/Home' から Home をインポートします。
'../components/About' から About をインポートします
'../components/User' から User をインポートします。
// Vue.use(VueRouter) から Vue.use(plugin) までプラグインをインストールします

// VueRouterオブジェクトを作成する constroutes = [
    {
        パス: ''、
        リダイレクト: '/home'
    },
    {
        パス: '/home',
        コンポーネント: ホーム
    },
    {
        パス: '/about',
        コンポーネント: について
    }, 
    <!--これがキーコードです-->
    {
        パス: '/user/:id',
        コンポーネント: ユーザー
    },
]

const ルーター = 新しい VueRouter({
    //ルートとコンポーネントルート間のアプリケーション関係を設定します。
    モード: "履歴"、
    リンクアクティブクラス: "アクティブ"
})

// ルータオブジェクトをVueインスタンスに渡す export default router

2. ユーザーコンポーネント User.vue を作成する

<テンプレート>
    <div>
        <h1>私はAPPページです</h1>
        {{$route.params.id}}
    </div>
</テンプレート>

3. ホームページの表示
アプリ.vue

    <router-link to="/home/Geek Mouse" >ユーザー名を取得するテスト</router-link><br>

4. レンダリング

ここに画像の説明を挿入

4. ルートの遅延読み込み

4.1. 遅延読み込みを理解する

公式の説明は次のとおりです。
アプリをバンドルすると、JavaScript バンドルが非常に大きくなり、ページの読み込み時間に影響する可能性があります。
異なるルートに対応するコンポーネントを異なるコード ブロックに分割し、ルートにアクセスしたときに対応するコンポーネントをロードできれば、より効率的になります。公式は何と言っていますか?
まず、ルートには通常、さまざまなページが定義されていることがわかります。
このページは最終的にどこにパッケージ化されるのでしょうか? 通常は、js ファイル内に配置されます。
ただし、1 つの js ファイルに多数のページを配置すると、必然的にページが非常に大きくなります。
このページをサーバーに一度に要求すると、時間がかかる可能性があり、ユーザーのコンピューターがしばらく空白になることもあります。
この状況を回避するにはどうすればよいでしょうか? ルートの遅延読み込みを使用します。
ルートの遅延読み込みは何をしますか?
ルートの遅延読み込みの主な機能は、ルートに対応するコンポーネントを個別の js コード ブロックにパッケージ化することです。
このルートにアクセスした場合にのみ、対応するコンポーネントがロードされます

4.2. 遅延読み込み効果

//ルーティング関連情報を構成するimport Vue from 'vue'
「vue-router」からVueRouterをインポートします。

const Home = () => import ('../components/Home')
const About = () => import ('../components/About')
const User = () => import ('../components/User')
// Vue.use(VueRouter) から Vue.use(plugin) までプラグインをインストールします

// VueRouterオブジェクトを作成する constroutes = [
    {
        パス: ''、
        リダイレクト: '/home'
    },
    {
        パス: '/home',
        コンポーネント: ホーム
    },
    {
        パス: '/about',
        コンポーネント: について
    }, {
        パス: '/user/:id',
        コンポーネント: ユーザー
    },
]

const ルーター = 新しい VueRouter({
    //ルートとコンポーネントルート間のアプリケーション関係を設定します。
    モード: "履歴"、
    リンクアクティブクラス: "アクティブ"
})

// ルータオブジェクトをVueインスタンスに渡す export default router

4.3. 遅延読み込み方式

ここに画像の説明を挿入

5. ルートのネスト使用

5.1. ネストされたルーティングを理解する

ネストされたルーティングは非常に一般的な機能です。たとえば、ホームページでは、/home/news と /home/message を通じて一部のコンテンツにアクセスする必要があります。
1 つのパスは 1 つのコンポーネントにマップされ、これら 2 つのパスにアクセスすると、それぞれ 2 つのコンポーネントがレンダリングされます。

コンポーネントとパスの関係

ここに画像の説明を挿入

5.2 実装プロセス

1. メッセージとニュースの2つのコンポーネントを作成する

メッセージ.vue

<テンプレート>
  <div id="about">最新ニュース</div>
</テンプレート>
<スクリプト>

</スクリプト>

ニュース.vue

<テンプレート>
  <div id="about">ニュースコンテンツ</div>
</テンプレート>
<スクリプト>

</スクリプト>

2. サブルートを中心にルーティング情報を設定する

'vue' から Vue をインポートします
'vue-router' から VueRouter をインポートします。
const Home = () => import('../components/Home')
const About = () => import('../components/About')
const Message = () => import('../components/Message')
const News = () => import('../components/News')

// 1. Vue.use(プラグイン名) Vue.use(VueRouter); を通じてプラグインをインストールします。

// 2. VueRouterオブジェクトを作成する constroutes = [
    {
        パス:'/home',
        コンポーネント:ホーム、
        子供たち:[
            {
                パス:'ニュース',
                コンポーネント: ニュース
            },
            {
                パス:'メッセージ',
                コンポーネント: メッセージ
            }
        ]
    },
    {
        パス: '/home/:ユーザー名',
        コンポーネント: ホーム
    },
    
    {
        パス: '/about',
        コンポーネント: について
    }
]

// 3. ルーティングとコンポーネント間のマッピング関係を構成する const router = new VueRouter({
    ルート、
    モード: '履歴'、
    // リンクアクティブクラス: 'アクティブ'
})

// 4. ルータオブジェクトをVueインスタンスに渡す export default router

ここに画像の説明を挿入

3. 親コンポーネントが子コンポーネントの情報をレンダリングする

ホーム.vue

<テンプレート>
  <div id="ホーム">
    私はホームページのコンテンツです<br>

    <router-link to="/home/news"> ニュース</router-link>
    <router-link to="/home/message"> メッセージ</router-link>
    <ルータービュー></ルータービュー>
    <!-- <h2>ユーザー名: {{ $route.params.username }}</h2> -->
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: "ホーム",
};
</スクリプト>

4. レンダリング

画像の説明を追加してください

5.3. ネストされたルートのデフォルトパス

リダイレクト

{
        パス: '/user',
        コンポーネント: ユーザー、
        子供たち: [
            {
                パス: 'メッセージ',
                コンポーネント: メッセージ、
            },
            {
                パス: 'ニュース',
                コンポーネント: ニュース、
            },
            // /user/news をリダイレクト
            {
                パス: ''、
                リダイレクト: 'ニュース'、
            },
        ]
    },

6. ルーティングパラメータ

渡されるパラメータには、主に2つの種類があります: paramsとquery
パラメータタイプ

1. ルーティング形式を設定する: /router/:id

2. 転送方法: 対応する値のパスをたどる

3. 送信後に形成されたパス: /router/123、/router/abc

クエリタイプ

1. ルーティングフォーマットを設定します: /router、これは通常の設定です

2. 転送方法: オブジェクトで使用されるクエリキーは送信方法として使用されます

3. 送信後に形成されたパス: /router?id=123,/router?id=abc

6.1. 準備

渡されたパラメータの1つ: router-link

1. コンポーネントProfile.vueを作成する

<テンプレート>
  <div>
    <h2>私はプロフィールページです</h2>
    <p>私のプロフィールページの詳細</p>
    <!-- 文字列入力を取得します。例: /profile/123 -->
    <p>$route.params:{{ $route.params }}</p>
    <!-- オブジェクト タイプ入力パラメータを取得します (例: /profile?name=1&age=10) -->
    <p>$route.query:{{ $route.query }}</p>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:「プロフィール」、
};
</スクリプト>

<スタイルスコープ>
</スタイル>

2. ルーティングを構成する

const Profile = () => import('../components/Profile')
    {
        パス: '/profile/:id',
        コンポーネント: プロファイル
    }

3. app.vue ページ表示

 <ルータリンク
      :to="{
        パス: '/profile/' + 123,
        クエリ: { 名前: 'geekmice'、趣味: 'バスケットボール' }
      }"
      タグ="ボタン"
      >router-link はパラメータを渡します</router-link
    >

4. 最終効果

ここに画像の説明を挿入

パラメータの受け渡し 2: js 実装

    <button @click="jsTransferParams">js 転送パラメータ</button>
   jsTransferParams() {
      this.$router.push({
        パス: "/profile/" + 666,
        クエリ: { 名前: "geekmice", 趣味: "ブラックテクノロジーの探求" },
      });
    },
    
    profile.vue はパラメータを取得します <p>$route.params:{{ $route.params }}</p>
    <p>$route.query:{{ $route.query }}</p>

ここに画像の説明を挿入

6.2. パラメータを取得する

$route オブジェクトを通じてパラメータを取得します。

vue-router を使用するアプリケーションでは、ルーティング オブジェクトが各コンポーネントに挿入され、this.$route に割り当てられ、ルートが切り替えられるとルーティング オブジェクトが更新されます。
$routeによって渡される情報は次のとおりです

ここに画像の説明を挿入

6.3、ルーターとルートの違い

簡単に言えば、1 つはルーティング情報を取得するために使用され、もう 1 つはルーティングを操作するために使用されます。

$router は VueRouter インスタンスです。別の URL に移動する場合は、$router.push メソッドを使用して、ジャンプ メソッド、フック関数などをルーティングします。

$route は現在のルーター リダイレクト オブジェクトであり、name、meta、path、hash、query、params、fullPath、matched、redirectedFrom などを取得できます。

7. ルーティングナビゲーションガード

vue-routerが提供するナビゲーションガードは、主にルートの入口と出口を監視するために使用されます。
vue-router は beforeEach および afterEach フック関数を提供しており、ルートが変更される前と後にトリガーされます。

beforeEachを使用してタイトルの変更を完了します

  • まず、フックにいくつかのタイトルを定義します。これはメタを使用して定義できます。
  • 次に、ナビゲーションガードを使用してタイトルを変更します
//ルーティング関連情報を構成するimport Vue from 'vue'
「vue-router」からVueRouterをインポートします。

const Home = () => import('../components/Home')
const About = () => import('../components/About')
const User = () => import('../components/User')
const Message = () => import('../components/Message')
const News = () => import('../components/News')
const Profile = () => import('../components/Profile')

// Vue.use(VueRouter) から Vue.use(plugin) までプラグインをインストールします

// VueRouterオブジェクトを作成する constroutes = [
    {
        パス: ''、
        リダイレクト: '/home'
    },
    {
        パス: '/home',
        コンポーネント: ホーム、
        メタ: {
            タイトル: 「ホーム」
        }
    },
    {
        パス: '/profile/:id',
        コンポーネント: プロファイル、
        メタ: {
            タイトル: 「アーカイブ」
        }
    },
    {
        パス: '/about',
        コンポーネント: について、
        メタ: {
            タイトル: 「概要」
        }
    }, {
        パス: '/user',
        コンポーネント: ユーザー、
        子供たち: [
            {
                パス: 'メッセージ',
                コンポーネント: メッセージ、
            },
            {
                パス: 'ニュース',
                コンポーネント: ニュース、
            },
            {
                パス: ''、
                リダイレクト: 'ニュース'、
            },
        ]
    },
]

const ルーター = 新しい VueRouter({
    //ルートとコンポーネントルート間のアプリケーション関係を設定します。
    モード: "履歴"、
    リンクアクティブクラス: "アクティブ"
})

router.afterEach((to, from, next) => {
    ドキュメントのタイトル = to.matched[0].meta.title;
    次()
})

// ルータオブジェクトをVueインスタンスに渡す export default router

レンダリング

画像の説明を追加してください

簡単な説明

ナビゲーションフックの3つのパラメータの分析

  • to: 入力するターゲットのルーティングオブジェクト
  • from: 現在のナビゲーションがこれから出発するルートオブジェクト
  • このメソッドを呼び出した後、次のフックに入ることができます

8. キープアライブ

このコンポーネントは Vue の組み込みコンポーネントであり、コンポーネントの切り替え中に状態をメモリ内に保持して、DOM の繰り返しレンダリングを防ぐことができます。
理解するためのケース説明

要件: KeepStart と KeepEnd の 2 つのコンポーネントがあります。KeepStart コンポーネントには入力ボックスがあり、入力情報をキャッシュできます。KeepEnd コンポーネントはキャッシュできません。

ソースコードの実装
1.KeepStart.vue

<テンプレート>
    <div>
        <h1>スタートページ</h1>
        <input type="text" placeholder="入力してください..."">
    </div>
</テンプレート>

2. KeepEnd.vue

<テンプレート>
    <div>
        <h1>ページをキャッシュする必要はありません</h1>
        <input type="text" placeholder="入力してください">
    </div>
</テンプレート>

3. ルーター->index.js

const KeepStart = () => import('../components/KeepStart')
const KeepEnd = () => import('../components/KeepEnd')
  {
        パス: '/keepStart',
        コンポーネント: KeepStart、
        名前:'keepStart',
        メタ: {
            キープアライブ: 真
        }
    },
    {
        パス: '/keepEnd',
        名前:'keepEnd',
        コンポーネント: KeepEnd、
        メタ: {
            キープアライブ: 偽
        }
    }

4. アプリ

    <router-link to="/keepStart" tag="button">keepstart ページ</router-link>
    <router-link to="/keepEnd" tag="button">keepend ページ</router-link>
    <!-- 動的レンダリング コンポーネント -->
    <!-- <ルータービュー></ルータービュー> -->
    <キープアライブ>
      <ルータービュー v-if="$route.meta.keepAlive"></ルータービュー>
    </キープアライブ>
    <ルータービュー v-if="!$route.meta.keepAlive"></ルータービュー>

レンダリング

画像の説明を追加してください

9. タブバーの練習

9.1. 要件ステートメント

レンダリング

画像の説明を追加してください

説明<br /> カテゴリ、ホーム、ショッピング カート、マイの 4 つの列を持つナビゲーション バーを実装します。ユーザーは各列をクリックして、異なるページを表示します。スロットの概念を使用してスケーラビリティを実現します。

9.2 需要分析

  • 1. 以下に別のTabBarコンポーネントがある場合、それをインストールする方法

TabBarコンポーネントをカスタマイズしてアプリで使用する

下部にタブバーを作成し、関連するスタイルを設定します

  • 2. TabBarに表示されるコンテンツは外部で決定される

スロットの定義

フレックスレイアウト評価 TabBar

  • 3. TabBarItemをカスタマイズし、画像やテキストを渡すことができます

TabBarItemを定義し、画像とテキストの2つのスロットを定義します。

2つのスロットにスタイル用の外側のラッパーdivを追加します

スロットを埋めて下部のタブバーの効果を実現します

  • 4. 選択したハイライト画像を渡す

アクティブアイコンのデータを挿入するための別のスロットを定義します

変数isActiveを定義し、v-showを使用して対応するアイコンを表示するかどうかを決定します。

  • 5. TabBarItemはルーティングデータをバインドする

ルーティングをインストールする npm install vue-router --save

router->index.jsを完成させ、対応するコンポーネントを作成します。

main.jsはルーターを登録します

App.vue はルータービューコンポーネントのレンダリングを追加します

  • 6. 項目をクリックして対応するルーティングテーブルにジャンプし、isActiveを動的に設定します。

アイテムのクリックをリッスンし、ルーティング パスを this.$router.replace() で置き換えます。

アクティブかどうかを判断するには、this.$route.path.indexOf(this.link) !== -1 を使用します。

  • 7. アクティブスタイルを動的に計算する

新しい計算プロパティ this.isActive をカプセル化します。{'color':'red'}:{}

9.3. 需要の実現

実装バージョン1

Vueプロジェクトを作成する

vue ナビゲーションバーを作成する

不要なコンポーネントを削除する HelloWorld イメージ

シンプルなディレクトリ構造

ここに画像の説明を挿入

アプリ.vue

<テンプレート>
  <div id="アプリ">
    <div id="タブバー">
      <div id="tab-bar-item">ホーム</div>
      <div id="tab-bar-item">カテゴリー</div>
      <div id="tab-bar-item">ショッピングカート</div>
      <div id="tab-bar-item">マイ</div>
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:「アプリ」、
  コンポーネント: {},
};
</スクリプト>

<スタイル>
/* CSS スタイルをインポート */
@import url("./assets/css/base.css");

#タブバー{
  ディスプレイ: フレックス;
  背景色: rgb(246, 246, 246);

  /* 絶対位置指定 */
  位置: 固定;
  左: 0;
  下部: 0;
  右: 0;
}

#タブバー項目 {
  フレックス: 1;
  テキスト配置: 中央;
  高さ: 49px;


}
</スタイル>

ベース.css

体{
    パディング: 0;
    マージン: 0;
}

レンダリング

ここに画像の説明を挿入

最終版<br /> ディレクトリ構造

ここに画像の説明を挿入

主要なソースコードの実装

TabBar.vue パッケージ

<テンプレート>
  <div id="タブバー">
    <スロット></スロット>
  </div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    名前: "タブバー"
  }
</スクリプト>

<スタイルスコープ>
  #タブバー{
    ディスプレイ: フレックス;
    背景色: #f6f6f6;

    位置: 固定;
    左: 0;
    右: 0;
    下部: 0;

    ボックスの影: 0 -1px 1px rgba(100,100,100,.2);
  }
</スタイル>

TabBarItem.vue パッケージ

<テンプレート>
  <!--すべてのアイテムに同じ画像とテキストが表示されます-->
  <div class="タブバーアイテム" @click="itemClick">
    <div v-if="!isActive"><スロット名="アイテムアイコン"></スロット></div>
    <div v-else><slot name="item-icon-active"></slot></div>
    <div :style="activeStyle"><slot name="item-text"></slot></div>
  </div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    名前: "TabBarItem",
    小道具: {
      パス: 文字列、
      アクティブカラー: {
        タイプ: 文字列、
        デフォルト: '赤'
      }
    },
    データ() {
      戻る {
        // アクティブ: true
      }
    },
    計算: {
      アクティブです() {
        // /home -> item1(/home) = true
        // /home->item1(/category) = false
        // /home->item1(/cart) = true
        // /home->item1(/profile) = true
        this.$route.path.indexOf(this.path) !== -1 を返します
      },
      アクティブスタイル() {
        this.isActive を返しますか? {color: this.activeColor} : {}
      }
    },
    メソッド: {
      アイテムクリック() {
        this.$router.replace(this.path)
      }
    }
  }
</スクリプト>

<スタイルスコープ>
  .タブバー項目 {
    フレックス: 1;
    テキスト配置: 中央;
    高さ: 49px;
    フォントサイズ: 14px;
  }

  .タブバーアイテム画像 {
    幅: 24px;
    高さ: 24px;
    上マージン: 3px;
    垂直位置合わせ: 中央;
    下マージン: 2px;
  }
</スタイル>

ルーティングを設定するindex.js

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

const Home = () => import('../views/home/Home')
const カテゴリー = () => インポート('../views/category/カテゴリー')
const Cart = () => import('../views/cart/Cart')
const Profile = () => import('../views/profile/Profile')

// 1. プラグインをインストールする Vue.use(VueRouter)

// 2. ルーティングオブジェクトを作成する constroutes = [
  {
    パス: ''、
    リダイレクト: '/home'
  },
  {
    パス: '/home',
    コンポーネント: ホーム
  },
  {
    パス: '/category',
    コンポーネント: カテゴリ
  },
  {
    パス: '/cart',
    コンポーネント: カート
  },
  {
    パス: '/profile',
    コンポーネント: プロファイル
  }
]
const ルーター = 新しい VueRouter({
  ルート、
  モード: '履歴'
})

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

最終結果

ここに画像の説明を挿入

VueRouter ルーティングに関するこの記事はこれで終わりです。VueRouter ルーティングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3ルーティングVueRouter4を使用する簡単な例
  • VueRouterのaddRoutesメソッドを使用して、ユーザー権限ルートを動的に追加する
  • VueRouter の高度なナビゲーションフックとルーティングメタ情報の詳細な説明
  • Vue 学習 - VueRouter ルーティングの基礎

<<:  Docker での Redis 接続の急増をトラブルシューティングした実践的な記録

>>:  MySqlを最適化するためにnot inを使用する方法

推薦する

MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコード

MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコードMySQL シーケ...

テーブル適応とオーバーフローのいくつかの設定の詳細な説明

1. テーブル リセットの 2 つのプロパティ: ①border-collapse: collaps...

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

ボタンの 4 つのクリック応答方法の概要

ボタンは頻繁に使用されます。ここでは、イベント処理メソッドを整理し、実装方法が多数あることを発見しま...

Centos7.5 は mysql5.7.24 バイナリ パッケージの展開をインストールします

1. 環境整備:オペレーティング システム: CentOS Linux リリース 7.5.1804 ...

vueはel-tableの列幅の適応を完璧に実現します

目次背景技術的ソリューション具体的な実装要約する背景Element UI は、PC で人気の Vue...

ブラウザでTIF形式の画像を表示する方法

ブラウザはTIF形式の画像を表示しますコードをコピーコードは次のとおりです。 <html>...

CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

CSS3 はアニメーションを作成でき、多くの Web ページのアニメーション画像、Flash アニメ...

jsを使用して写真をアップロードする機能を実現する

フロントエンドで画像をアップロードする原理は、入力 type="file" タグ...

docker-compose でデプロイしたときに MySQL にアクセスできなくなる問題の簡単な分析

Docker-ComposeとはCompose プロジェクトは、以前の fig プロジェクトから派生...

Vueは動的に生成されたコンポーネントをドラッグアンドドロップする要件を実装します

目次製品要件アイデア問題ライブラリ選択をドラッグコンポーネントを生成する方法コンポーネントを生成する...

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

この記事では、参考として MySQL 5.7.23 のインストール チュートリアルを記録します。 1...

Apache Web サーバーを使用して 2 つ以上のサイトを構成する方法

人気があり強力な Apache Web サーバーで 2 つ以上のサイトをホストする方法。前回の記事で...

VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

vmware vSphere 6.5 は vSphere ソフトウェアのクラシック バージョンであ...