Vue の関連ページへのマルチレベルジャンプ (ページドリルダウン) 機能の完全な例

Vue の関連ページへのマルチレベルジャンプ (ページドリルダウン) 機能の完全な例

背景

プロジェクト開発プロセスでは、前のページから次のページにジャンプする必要に迫られることがよくあります。これは一般にドリルダウンと呼ばれます。たとえば、概要ページでデータの詳細を表示する必要がある場合は、グラフまたはボタンをクリックして詳細ページに移動し、詳細なデータを表示します。

今のところ、私たちのプロジェクトでは統一されたページジャンプの方法がなく、ページジャンプの実装方法は人によって異なります。また、既存のプロジェクトの多くは、2 ページ間を前後にジャンプすることしかできず、基本的に複数のページ間をジャンプする完全な機能はありません。

プロジェクトの共通機能として、関連ページジャンプは、非常に反復的なコードロジックを実行します。関連するロジックを抽出し、シンプルで使いやすいパブリックメソッドとパブリックコンポーネントにカプセル化することが非常に重要です。

目的

各プロジェクトの関連するジャンプ メソッド ロジックを統合し、シンプルで使いやすいパブリック コンポーネントにカプセル化します。

ソリューション設計

まず、関連するページジャンプの論理的な手順を分析しましょう。

  1. ページ A に移動します。
  2. ページ A からページ B へジャンプします。
  3. ページ B に移動します。
  4. ページ A に戻ります。
  5. ページ A に入り、手順 1 に戻ります。

次に、上記の手順を分解します。

  1. ステップ 1 はページに通常どおり入力することであり、この時点では処理するロジックは存在しないと仮定します。
  2. ステップ 2: ページ A からページ B にジャンプする必要があります。このステップを実行するには、ページ B のルーティング アドレスを把握し、VueRouter を介してページ B のルーティング アドレスにジャンプする必要があります。ページ B にクエリ データが必要な場合は、ページ B のデータを保存してステップ 3 で使用する必要があります。
  3. ページ B に入った後、ページ A からクエリ データを取得する場合は、まずそれがページ A からのジャンプであるかどうかを判断する必要があります。そうである場合は、データが保存されているページ A からデータを取得します。
  4. ページ B からページ A に戻るには、ページ A のルーティング アドレスを知っていて、VueRouter を介してページ A のルーティング アドレスにジャンプする必要があります。ここでのルーティング アドレスは、ステップ 2 に進む前に保存して、ここで取得できるようにする必要があります。
  5. ステップ 1 とステップ 5 はどちらもページ A に入りますが、実行ロジックが異なります。したがって、ページ A がページ B にジャンプする前にデータを復元する場合、まずページ B からジャンプしているかどうかを判断する必要があります。そうである場合は、データが保存されている場所からジャンプ前のページ A のデータを取得します。ここでのジャンプ前のデータは、ステップ 2 のジャンプ前に保存して、ここで取得できるようにする必要があります。

次に、上記のロジックを実装するために、まずページAとページBのデータを保存する方法を決定します。ここではVUEXを使用します。上記の論理的な手順をもう一度整理し、フローチャートを描きます。

フローチャート

ソースページ

対象ページ

具体的な実装

ソースページからターゲットページへジャンプ

このステップのロジックは VUEX で記述されています。このステップを実行する必要があるたびに、VUEX で対応するメソッドを呼び出すだけです。具体的な実装ロジックは、まずルーティングパラメータにソースページとターゲットページの識別子を追加し(現在のページがターゲットページなのか、返されたソースページなのかを区別するため)、次にソースページとターゲットページのデータを保存し、ルーティングジャンプを実行します。

store.js に次の 2 つの変数を追加します。

tgtPageParams: {}, // 関連ジャンプのターゲット ページ データ (1 つの項目のみが保持されます)
srcPageParams: [], // 関連ジャンプのソースページデータ(配列型、複数ページのデータを保持、初期ページに戻るまで複数階層で返すことができる)

次に、次のメソッドを追加します。

// ジャンプを関連付け、対象ページにジャンプし、ソースページと対象ページのデータをVuexに保存します
goTargetPage(状態、オプション) {
  // ターゲット ページを記憶するために、ソース ページのクエリに tgtPageName 識別子を追加します。options.srcParams.query = Object.assign({}, options.srcParams.query, { tgtPageName: options.tgtParams.name });
  // ソース ページを記憶するために、ターゲット ページのクエリに srcPageName を追加します。options.tgtParams.query = Object.assign({}, options.tgtParams.query, { srcPageName: options.srcParams.name });

  state.srcPageParams.push(options.srcParams); // ソースページデータを保存します state.tgtPageParams = options.tgtParams; // ターゲットページデータを保存します router.push({ name: options.tgtParams.name, query: options.tgtParams.query }); // ターゲットページにジャンプします },

ターゲットページはソースページに戻ります

このステップのロジックは VUEX で記述されています。このステップを実行する必要があるたびに、VUEX で対応するメソッドを呼び出すだけです。具体的な実装ロジックは、state.srcPageParams からソース ページ データ (ルーティング アドレスとパラメータを含む) を取得し、ルーティング ジャンプを実行することです。

VUEX に次のメソッドを追加します。

// ジャンプを関連付け、ソースページに戻る goSourcePage(state, vm) {
  let obj = state.srcPageParams.slice(-1)[0]; // 配列の最後の項目を取得します // Vuex に前のページのデータがある場合は、Vuex のデータに基づいて前のページに戻ります if (obj && Object.keys(obj).length > 0) {
    router.push({ name: obj.name, query: obj.query }); // リダイレクト }
  // Vuex に前のページのデータがないが、ルートに前のページのフラグがある場合は、ルートフラグに従って前のページに戻ります (詳細ページを更新したときに Vuex データが失われ、前のページに戻れなくなる問題を防ぐためです)
  そうでない場合 (vm && vm.$route.query.srcPageName) {
    router.push({ name: vm.$route.query.srcPageName });
  }
},

対象ページに入り、VUEXデータを使用するか、ソースページに戻ってVUEXデータを復元します。

このステップのロジックは、上記のソリューション設計のステップ 3 とステップ 5 を組み合わせて、パブリック関数ファイルに記述することです。このステップを実行する必要があるたびに、Vue.prototype 内の対応するメソッドを直接呼び出すことができます。具体的な実装ロジックは、現在のページがソース ページかターゲット ページかを判別します。ターゲット ページの場合は、ソース ページから渡されたデータを使用します。ソース ページの場合は、ジャンプ前のデータを復元します。

次のメソッドをパブリック関数ファイル utils.js に追加し、Vue.prototype にアタッチします。

/**
 * このメソッドは、ジャンプ関連ページを関連付けるために使用できます* 1. ソースページ: Vuex に保存されたデータをデータに復元して使用できます* 2. ターゲットページ: ソースページから Vuex に渡されたデータをデータに入れて使用できます* 3. ソースページのデータが復元された後、Vuex 内の対応するバックアップデータを削除し、ルートに保存されたターゲットページ識別子を削除します* @param vm {object} 必要な現在の Vue コンポーネントインスタンス*/
$changeVueData: (vm) => {
  tgtParams = store.state.tgtPageParams とします。
  let srcParams = vm.$store.state.srcPageParams.slice(-1)[0] || {}; // 最後の要素の値を取得します。let name = vm.$route.name;
  let query = vm.$deepCopyJSON(vm.$route.query); // ここでディープコピーを行うのは、$route.query を更新する必要があるためです // 現在のページがターゲットページかソースページかを判定します // 判定条件は、まずルート名が一貫しているかどうか、次に指定されたクエリの属性値も一貫しているかどうかです let isTgtPage = tgtParams.name === name &&
    (tgtParams.checkKeys ? tgtParams.checkKeys.every(key => tgtParams.query[key] === query[key]) : true);
  isSrcPage = srcParams.name === name && とします。
    (srcParams.checkKeys ? srcParams.checkKeys.every(key => srcParams.query[key] === query[key]) : true);

  // 現在のページがターゲットページの場合 if (isTgtPage) {
    Object.assign(vm.$data, tgtParams.data || {}); // ソース ページから現在のページの data() に渡されたデータを更新して、ページがデータを照会できるようにします。}
  // 現在のページがソースページの場合 if (isSrcPage) {
    Object.assign(vm.$data, srcParams.data || {}); // 現在のページの data() にジャンプする前に保存されたデータを更新して、ページを復元できるようにします。 store.commit('popSourcePage'); // srcPageParams の最後のデータ項目を削除します。 // ソース ページに関連付けられたジャンプ ロジックが完了したら、ページの更新に関する問題を防ぐため、現在のページ ルートのターゲット ページ識別子をクリアします。 delete query.tgtPageName;
    vm.$router.push({名前、クエリ});
  }
},

前のページに戻るボタン

関連するジャンプ機能をより便利に使用できるように、前のページに戻るボタンをコンポーネントにカプセル化します。具体的な実装コードは次のとおりです。

// 戻るボタン.vue
<テンプレート>
  <button class="primary-btn return-btn" v-if="showBackBtn" @click="backFn">
    <i class="return-icon"></i>{{ backText }}
  </ボタン>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: '戻るボタン',
  小道具: {
    // 前のページのテキストに戻る backText: {
      タイプ: 文字列、
      デフォルト: () => '前のステップ'
    },
    // 前のページに戻る関数 backFn: {
      タイプ: 関数、
      デフォルト: () => {}
    }
  },
  データ() {
    戻る {
      表示バックボタン: false、
    };
  },
  マウント() {
    this.setBackBtnShow();
  },
  アクティブ化() {
    this.setBackBtnShow();
  },
  メソッド: {
    // 前のページに戻るためのボタンのステータスを更新する setBackBtnShow() {
      this.$nextTick(() => {
        srcPage = this.$store.state.srcPageParams.slice(-1)[0] とします。
        this.showBackBtn = Boolean(srcPage && Object.keys(srcPage).length > 0);
      });
    },
  },
};
</スクリプト>
<スタイル スコープ lang="scss">
</スタイル>

フォールトトレランス

関連付けジャンプのプロセス中に、ユーザーが突然ページを中断したり更新したりするなどの異常な操作が発生する可能性があることを考慮して、いくつかのフォールト トレランス メカニズムが設計されています。

// ルートコンポーネント App.vue
/*...コードは省略...*/
時計:
  // listen、ルートが変更されたときに実行 $route(to, from) {
    // ソースページでもターゲットページでもない場合は、Vuex に保存されているデータをクリアします // 関連するジャンプ中にメニューを切り替えたり、他の操作を実行したりしないようにします。その結果、Vuex 内の最後の関連するジャンプからのデータが残ります if (!to.query.srcPageName && !to.query.tgtPageName) {
      this.$store.commit('clearTargetPage');
      this.$store.commit('clearSourcePage');
    }
  },
},
/*...コードは省略...*/

使用例

上記のスキームに従って、設計部分の手順は次のとおりです。

ステップ 1 とステップ 5 でページ A に入ります。ロジックは同じページにあり、コードは次のようになります。

// ページ A.vue
/*...コードは省略...*/
マウント() {
  vm = これ;
  vm.$changeVueData(vm); // 関連ページへジャンプします。ページに入るたびに、$changeVueData 関数を実行する必要があります。具体的な使用方法については、呼び出しメソッドのコメントを参照してください。 vm.ready();
},
/*...コードは省略...*/
ステップ 2、ページ A からページ B にジャンプします。コードは次のとおりです。

// ページ A.vue
/*...コードは省略...*/
メソッド: {
  // ページBにジャンプ goUserSituation: function (name) {
    srcParams = {とする
      名前: vm.$route.name、
      クエリ: vm.$route.query
    };
    tgtParams = {とする
      名前: 'ユーザー状況'、
      データ: {
        チェックされたシステム: 名前
      }
    };
    vm.$goTargetPage(srcParams、tgtParams);
  },
},
/*...コードは省略...*/

ステップ 3、ページ B に入ります。コードは次のとおりです。

// ページ B.vue
/*...コードは省略...*/
マウント() {
  vm = これ;
  vm.$changeVueData(vm); // 関連ページへジャンプします。ページに入るたびに、$changeVueData 関数を実行する必要があります。具体的な使用方法については、呼び出しメソッドのコメントを参照してください。 vm.ready();
},
/*...コードは省略...*/
ステップ 4、ページ A に戻ります。コードは次のようになります。

// ページ B.vue
/*...コードは省略...*/
<テンプレート>
  <div>
    <backButton :backFn="$goSourcePage"></backButton>
    /*...コードは省略...*/
  </div>
</テンプレート>
/*...コードは省略...*/

要約する

この記事では、関連ページのマルチレベルジャンプ(ページドリルダウン)機能の実装について詳しく紹介します。 コアアイデアは、VUEXグローバル状態管理を通じて、関連するジャンプ元ページとターゲットページのデータを保存することです。 ジャンプ前に必要なデータが保存されます。 ターゲットページにジャンプすると、ターゲットページに必要なデータがVUEXから取得されます。 ソースページにジャンプすると、ソースページのデータがVUEXから復元されます。

これらの主要なアクションを共通のメソッドとコンポーネントにカプセル化すると、各プロジェクトの関連するページ ジャンプ メソッドが統合されるだけでなく、コードの品質が向上し、後のメンテナンスが容易になります。なお、記事ではフォールトトレランス部分の一部しか書かれていませんが、今後この機能を継続的に改善する必要があれば、フォールトトレランス部分を改善していただくことも可能です。

これで、関連ページへのマルチレベルジャンプ(ページドリルダウン)機能のVue実装に関する記事は終了です。Vue関連ページのマルチレベルジャンプに関するより詳しい内容は、123WORDPRESS.COMの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue はトークンの有効期限が切れると自動的にログインページにジャンプする機能を実装します
  • vuexを使用してページにジャンプする方法
  • Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策
  • Vueページジャンプの実装方法
  • Vue this.$router.push(parameter) はページジャンプ操作を実装します
  • Vueページジャンプの送信パラメータと受信方法
  • Vueプロジェクトでページジャンプを実装する方法

<<:  MySQL の count()、group by、order by の詳細な説明

>>:  Linux で MySQL をインストールして設定する

推薦する

Linux に ASPNET.Core3.0 ランタイムをインストールするためのサンプル コード

# 以下の例は x64 ビット ランタイム v3.0.0 用です mkdir /runtimes ...

win10 での mysql 8.0.16 winx64 インストールの最新グラフィック チュートリアル

このデータベースをダウンロードするには、多くの時間とトラフィックがかかります。踏み込んだ落とし穴で時...

Navicat を使用して csv ファイルを MySQL にインポートする

この記事では、参考までに、Navicatを使用してCSVファイルをMySQLにインポートするための具...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

Windows 上の MySQL 5.6 で my.ini 設定ファイルを見つける方法

忘れてしまった場合に後で戻って確認できるようにメモしておいてください。問題の説明:今日はちょっとした...

DockerとDocker-Composeの使用例

Docker は、アプリケーションをより速く配信するのに役立つオープンソースのコンテナ エンジンです...

クロスドメイン js フロントエンドの 8 つの実装ソリューション

目次1. jsonp クロスドメイン2. document.domain + iframe クロスド...

TypeScriptはvscodeを使用してコードのコンパイルプロセスを監視します

インストールtsコマンドをグローバルにインストールする npm install -g typescr...

Linux システムの /etc/fstab ファイルの詳細な解釈

序文 [root@localhost ~]# cat /etc/fstab # #/etc/fsta...

Linux学習におけるmkdirコマンドの詳しい説明

目次序文1. ファイルの概念に関する基礎知識2. mkdir コマンド序文最近、Linux にますま...

JavaScript の 3 つの BOM オブジェクト

目次1. 場所オブジェクト1. URL 2. 場所オブジェクトのプロパティ3. ロケーションオブジェ...

スライドドアを実装するための CSS サンプルコード

いわゆるスライディングドアテクノロジーとは、さまざまな長さのテキストに合わせてボックスの背景を自動的...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

さまざまなブラウザでのhrタグの説明

通常、人事担当者と会うことはめったにありませんが、一度会うと、それが生死を分けることもあります。 H...

JavaScript はスローモーションアニメーションのカプセル化と使用法を説明します

プロセス分析の実装(1)繰り返して電話をかけるには?答え: 関数をカプセル化して一度だけ呼び出すコー...