背景プロジェクト開発プロセスでは、前のページから次のページにジャンプする必要に迫られることがよくあります。これは一般にドリルダウンと呼ばれます。たとえば、概要ページでデータの詳細を表示する必要がある場合は、グラフまたはボタンをクリックして詳細ページに移動し、詳細なデータを表示します。 今のところ、私たちのプロジェクトでは統一されたページジャンプの方法がなく、ページジャンプの実装方法は人によって異なります。また、既存のプロジェクトの多くは、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をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL の count()、group by、order by の詳細な説明
>>: Linux で MySQL をインストールして設定する
# 以下の例は x64 ビット ランタイム v3.0.0 用です mkdir /runtimes ...
このデータベースをダウンロードするには、多くの時間とトラフィックがかかります。踏み込んだ落とし穴で時...
この記事では、参考までに、Navicatを使用してCSVファイルをMySQLにインポートするための具...
問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...
忘れてしまった場合に後で戻って確認できるようにメモしておいてください。問題の説明:今日はちょっとした...
Docker は、アプリケーションをより速く配信するのに役立つオープンソースのコンテナ エンジンです...
目次1. jsonp クロスドメイン2. document.domain + iframe クロスド...
インストールtsコマンドをグローバルにインストールする npm install -g typescr...
序文 [root@localhost ~]# cat /etc/fstab # #/etc/fsta...
目次序文1. ファイルの概念に関する基礎知識2. mkdir コマンド序文最近、Linux にますま...
目次1. 場所オブジェクト1. URL 2. 場所オブジェクトのプロパティ3. ロケーションオブジェ...
いわゆるスライディングドアテクノロジーとは、さまざまな長さのテキストに合わせてボックスの背景を自動的...
この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...
通常、人事担当者と会うことはめったにありませんが、一度会うと、それが生死を分けることもあります。 H...
プロセス分析の実装(1)繰り返して電話をかけるには?答え: 関数をカプセル化して一度だけ呼び出すコー...