vue-routerのマッチングに基づいてパンくずリスト機能を実現する

vue-routerのマッチングに基づいてパンくずリスト機能を実現する

この記事では主にvue-routerのmatchedをベースにしたbreadcrumb機能を紹介し、皆さんと共有します。詳細は以下の通りです。

上の図に示すように、これは一般的なパンくず効果です。一般的に、パンくずの内容には一定の階層関係があります。上の図を例にとると、まずホームページに入り、次に左側のナビゲーションをクリックしてアクティビティ管理の下にあるアクティビティリストページに入り、次にデータをクリックしてアクティビティの詳細ページに入ります。

これは、vue-router の mached 属性によって得られる結果とまったく同じ原理なので、これに基づいてパンくず効果を実現できます。

ここでは、elementui のパンくずコンポーネントとナビゲーション メニュー コンポーネントを使用しました。最終的な効果の画像は次のとおりです。

ルーティング構成

プロジェクト構造:

サイドナビゲーションバーはホームページ、電子デジタル、衣料品、靴のページに表示されるので、レイアウトコンポーネントを作成し、これら3つのルートのコンポーネントをコンポーネントにポイントし、レイアウトコンポーネントにナビゲーションバーとパンくずリストを記述しました。

この機能の実装はルートの階層的なネスト関係に依存するため、事前にルートの構成を考えておく必要があります。ここでの私のルート構成は次のとおりです。

定数ルート = [
 //空のルートに一致し、ルートルートにリダイレクトします{
        パス:''、
        リダイレクト: '/home',
        メタ:{
            パンくずリストを表示:false
        }
    },
    //ルートルート{
        パス:'/home',
        コンポーネント: ()=>import('@/views/layout/index.vue'),
        名前:'ホーム',
        メタ:{
            タイトル:"ホーム",
            パンくずリストを表示:true
        }
    },
    //電子デジタル{
        パス:'/electronics',
        名前:「電子デジタル」
        コンポーネント: ()=>import('@/views/layout/index.vue'),
        リダイレクト: '/electronics/computer',
        メタ:{
            タイトル:「電子デジタル」、
            パンくずリストを表示:true
        },
        子供たち:[
            {
                パス: 'コンピュータ',
                名前:'コンピュータ',
                コンポーネント()=>import('@/views/electronics/children/computer/index.vue')、
                メタ:{
                    タイトル:"コンピューター",
                    パンくずリストを表示:true
                }
            },
            {
                パス: '電話',
                名前:「携帯電話」、
                コンポーネント: ()=>import('@/views/electronics/children/phone/index.vue'),
                メタ:{
                    タイトル:「携帯電話」、
                    パンくずリストを表示:true
                }
            },
            {
                パス:'tv',
                名前:'テレビ',
                コンポーネント: ()=>import('@/views/electronics/children/tv/index.vue'),
                メタ:{
                    タイトル:"テレビ",
                    パンくずリストを表示:true
                }
            }
        ]
    },
    //衣類、靴、帽子{
        パス:'/clothing',
        名前:「衣類、靴、帽子」
        コンポーネント: ()=>import('@/views/layout/index.vue'),
        リダイレクト: '/clothing/tops',
        メタ:{
            タイトル: 「衣類、靴、帽子」
            パンくずリストを表示:true
        },
        子供たち:[
            {
                パス:'トップス',
                名前:'トップス',
                コンポーネント: ()=>import('@/views/clothing/children/tops/index.vue'),
                メタ:{
                    タイトル:"トップス",
                    パンくずリストを表示:true
                }
            },
            {
                パス:'lower',
                名前:'ボトムス',
                コンポーネント: ()=>import('@/views/clothing/children/lower/index.vue'),
                メタ:{
                    タイトル:"ボトムス",
                    パンくずリストを表示:true
                }
            },
            {
                パス:'靴',
                名前:「靴」、
                コンポーネント: ()=>import('@/views/clothing/children/shoes/index.vue'),
                メタ:{
                    タイトル:"靴",
                    パンくずリストを表示:true
                }
            }
        ]
    },
    //最後に配置します。前のすべてのルートが一致しない場合は、このルートが一致し、ルートルートにリダイレクトされます。{
        パス:'*'、
        リダイレクト:'/'、
        メタ:{
            パンくずリストを表示:false
        } 
    },   
]

ここでは、ホーム、エレクトロニクス、衣類、靴、帽子のルートを設定しました。これら 3 つは第 1 レベルのルートで、そのうちエレクトロニクス、デジタルと衣類、靴、帽子は第 2 レベルのルートです。メタでは、データをカスタマイズしました。ShowInbreadcrumb は、パンくずリストに表示するかどうかを決定するために使用されます。タイトルは、パンくずリストに表示される名前です。

ルーティング情報を取得する

テンプレート部分:

///src/views/layout/index.vue
<テンプレート>
    <div class="layout">
        <!-- サイドナビゲーションバー -->
        <div class="サイドメニュー">
            <el-メニュー
                デフォルトアクティブ="0"
                クラス="el-menu-vertical-demo"
                >
                    <div v-for="(item,index) ルート内" :key="index" :index="index+''">
                        <!-- セカンダリメニューはありません -->
                        <el-menu-item :index="index+''" v-if="!item.children">
                            <ルーターリンク:to="{name:item.name}">{{item.meta.title}}</ルーターリンク>
                        </el-menu-item>
                        <!-- セカンダリメニューあり -->
                        <el-submenu :index="index+''" v-else>
                            <テンプレート スロット="title">{{item.meta.title}}</テンプレート>
                            <el-menu-item v-for="(item_,index_) in item.children" :key="index_" :index="index+'-'+index_">
                                <ルーターリンク:to="{name:item_.name}">{{item_.meta.title}}</ルーターリンク>
                            </el-menu-item>
                        </el-サブメニュー>
                    </div>
            </el-menu>
        </div>
        <div class="content">
            <!-- パンくずリスト -->
            <div class="パンくず">
                <el-breadcrumb セパレータークラス="el-icon-arrow-right">
                    <el-breadcrumb-item v-for="(item,index) in breadcrumb" :key="index" :to="{ path: item.path}">{{item.meta.title}}</el-breadcrumb-item>
                </el-breadcrumb>
            </div>
            <!-- ルーティング終了 -->
            <ルータービュー></ルータービュー>
        </div>
    </div>
</テンプレート>

js部分:

エクスポートデフォルト{
    データ(){
        戻る {
        }
    },
    計算:{
        // サイドナビゲーションデータルート(){
            // $router.options からすべてのルーティング情報を取得し、フィルタリングしてこれを返します。$router.options.routes.filter((item)=>{
                item.meta.showInbreadcrumb を返す
            });
        },
        // パンくずデータ breadcrumb(){
            // ルート設定メタの showInbreadcrumb フィールドに従ってフィルタリングします。let matchedArr = this.$route.matched.filter((item)=>{
                戻り値 item.meta.showInbreadcrumb}
            );
            // ホームページは特別なので、パンくずリストの最初に必ず表示する必要があります。ホームページのルーティング情報がない場合は、手動で先頭に追加します。if (matchedArr [0].meta.title !== 'Home Page') {
                一致したArr.unshift(
                    {
                        パス:'/home',
                        メタ:{  
                            タイトル:"ホーム",
                            パンくずリストを表示:true
                        }
                    },
                )
            }
            一致したArrを返します。
        },
    }
}

注: this.$route.matched を取得した後、結果に直接追加してフィルタリングすることはできません。そうしないと、ページが乱れてエラーが報告されます。最初にフィルタリングして新しい配列を返し、その後ホームページ情報を判断して追加する必要があります。

最終結果

これで、vue-router matched をベースにしたパンくずリスト機能の実装に関する記事は終了です。vue-router matched のパンくずリストに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3 でパンくず関数コンポーネントをカプセル化するいくつかの方法
  • Vueパンくずコンポーネントのカプセル化方法
  • Vueはパンくずリストを実装するためにローカルストレージを使用する
  • Vue element-uiは動的なパンくずナビゲーションを実装します
  • Vue+elementUI は動的にパンくずナビゲーションを生成するチュートリアル
  • VUE+elementui ブレッドクラムを使用した動的ルーティングの詳細な説明
  • Vue のパンくずナビゲーション コンポーネントのサンプル コード
  • Vue の動的パンくずリスト機能を実装する方法
  • Vue2.0 elementUI はパンくずナビゲーションバーを作成します

<<:  PIP で docker-compose をインストールする際のタイムアウト問題の解決方法

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

推薦する

CSS レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法

序文最近、フロントエンドの知識をまとめており、いくつかのインタビューにも参加しました。インタビュー中...

docker で PostgreSQL データベースをインストールして永続化する方法

Dockerのインストール手順をスキップする1. postgresqlイメージを取得する docke...

Docker 経由で wsl の tar ファイルを作成する方法

最近VScodeのリモート開発機能をいじっています。Dockerのコンテナに接続できるほか、WSLに...

MySQLの行ロックとテーブルロックの意味と違いの詳細な説明

1. はじめに行ロックとテーブルロックの違いは面接で頻繁に出てくるはずです。MySQL のロックにつ...

MySQLリモートアクセスの設定方法をステップバイステップで説明します

序文MySQL データベースを使用する場合、クライアントはデータベース サーバーにリクエストを送信す...

背景位置パーセンテージ原則の詳細な説明

今日、誰かがコードを調整するのを手伝っていたとき、次のようなスタイルを見つけました。 背景位置: 5...

Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

Vueのコントロール商品数量コンポーネントのカプセル化と使用は参考までに。具体的な内容は以下のとお...

WeChat アプレット wxs 日付と時刻処理の実装例

目次1. 日付までのタイムスタンプ2. UTCを北京時間に変換するWXS (WeiXin Scrip...

Linuxでブーストライブラリをインストールするための完全な手順

序文Boost ライブラリは、標準ライブラリのバックアップとして機能し、C++ 標準化プロセスの開発...

MySQL列挙型のテスト例

プロジェクトを開発しているとき、支払い済み、支払済み、クローズ済み、返金済みなどの注文ステータスなど...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

Linux で SVN サーバーをインストールする方法

1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...

koa2 サービスに SSL を設定する方法

I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...

MySQL でのインデックスの追加と削除に関連する操作

目次1. インデックスの役割2. インデックスの作成と削除(1)ALTER TABLE文を使用して、...

1 つの記事で MySQL のプリコンパイルを理解する

1. プリコンパイルの利点私たちは皆、プリコンパイル機能を備えた JDBC の PreparedSt...