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 をインストールして設定する

推薦する

Win Server 2019 サーバーの IIS 構成と Web サイトの簡単な公開

1.まずサーバーにリモート接続する2. サーバーマネージャーを開く 3役割と機能の追加 4サーバープ...

Dockerでmongodbデータベースを使用するための実装コード

mongoイメージを取得する sudo docker pull mongo mongodbサービスを...

Vue の計算プロパティ

目次1. 基本的な例2. 計算プロパティキャッシュとメソッド3. 計算プロパティセッター序文:通常、...

データベースSQL文の最適化

最適化する理由:実際のプロジェクトが開始され、データベースが一定期間稼働した後、初期のデータベース設...

Alibaba Cloud に Docker をインストールする際の問題と解決策

質問Alibaba Cloud イメージを使用して Docker をインストールすると、次の図に示す...

rpm を使用して指定されたバージョンの docker (1.12.6) をインストールする詳細な手順

1. 理由システムが Centos7.3 の場合、yum install docker を使用して直...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

Linux での tcpdump コマンドの詳細な分析と使用方法

導入簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...

sbinディレクトリを生成せずにNginxをインストールするソリューション

エラーの説明: 1. Linux (CentOS 7 64) システムに Nginx (1.18.0...

32 典型的な列/グリッドベースのウェブサイト

列ベースの Web デザインのインスピレーションをお探しの場合は、32 個のクラシックな列/グリッド...

MySQL 5.7.31 64 ビット無料インストール版チュートリアル図

1. ダウンロードダウンロードアドレス: https://dev.mysql.com/get/Dow...

ブラウザでビデオプレーヤーを実装するための基本的な考え方とコード

目次序文ブラウザにおけるオーディオとビデオに関する知識のまとめビデオエンコーディング包装形態オーディ...

カラフルな時計効果を実現する JavaScript キャンバス

キャンバスを使ってカラフルな時計を書いてみよう! 1. タイトル(1)時計のケースが与えられ、ページ...

MySQLの自動増分IDについて知っておくべきこと

はじめに: MySQL を使用してテーブルを作成する場合、通常は自動インクリメント フィールド (A...

Nginx に lua-nginx-module モジュールをインストールする方法

ngx_lua_module は、lua パーサーを nginx に埋め込み、lua 言語で記述され...