Element における複数データ読み込み最適化の実装

Element における複数データ読み込み最適化の実装

シナリオ

最近、ElementUI をベースにしたバックグラウンド管理システムの開発を始めたのですが、偶然「el-select」ドロップダウン選択に問題があることを発見しました。ドロップダウン オプションをレンダリングする「options」のデータ量が多すぎると (このプロジェクトのデータ エントリの数は 10,000 を超えています)、ドロップダウン セレクターがスタックし、特にファジー マッチング フィルタリングの場合は、スタックがひどくなります。セレクターを初期化すると、クリックしても応答がなくなり、「ダイアログ」ポップアップ ウィンドウが表示されるまでに複数回クリックする必要がある場合があります (このドロップダウン フィルターはポップアップ ウィンドウに実装されています)。 多くのブログのメモを読んだ後、ようやく問題の解決策を見つけました。今後同様の問題に遭遇したときに簡単に参照できるように、この最適化計画をメモとして記録します。

注: 選択したドロップダウン フィルターに基づいて、カスタム イベントを通じてあいまい検索マッチングが実現されます。

次の 2 つのオプションがあります。

  • 1 つ目は、すべてのデータを取得し、取得したデータを入力キーワードでフィルタリングすることです。
  • 2 つ目は、input キーワードを通じてバックエンド インターフェイスを動的に要求し、インターフェイスによって返されるデータを通じてドロップダウン オプションを動的にレンダリングすることです。

コードの実装

Vueコンポーネントの例

<テンプレート>
  <div class="app">
    <el-dialog title="タイトル" :visible.sync="relatedOpen" :append-to-body="true" width="500px">
      <el-row :gutter="16">
        <el-col :span="20">
          <el-選択
            v-model="値"
            フィルター可能
            クリア可能
            スタイル="幅:100%"
            placeholder="選択してください"
            :loading="検索読み込み"
            :filter-method="フィルターメソッド"
            v-el-select-loadmore="loadMore(範囲番号)"
            @visible-change="可視変更"
          >
            <el-option v-for="item in options.slice(0, rangeNumber)" :key="item.key" :label="item.value" :value="item.key"></el-option>
          </el-select>
        </el-col>
        <el-col :span="4">
          <el-button type="primary" @click="submit">OK</el-button>
        </el-col>
      </el-row>
    </el-ダイアログ>
  </div>
</テンプレート>
  • 「v-el-select-loadmore」は、カスタム命令によってカプセル化されたデータ読み込み命令です。これは、elementUI ドロップダウン セレクターが大量のデータを読み込む場合に発生する遅延の問題を解決し、最適化するように設計されています。
  • 「filter-method」はドロップダウンセレクターのカスタム属性であり、入力変数を監視し、変数に基づいてデータを動的に取得できます。
  // カスタムディレクティブ: {
    "el-select-loadmore": (el, バインディング) => {
      // 要素 UI によって定義されたスクロール要素を取得します。const SELECTWRAP_ROM = el.querySelector(".el-select-dropdown .el-select-dropdown__wrap");
      (SELECTWRAP_ROM)の場合{
    // スクロールイベントを追加 SELECTWRAP_ROM.addEventListener("scroll", function() {
      // スクロールを決定します const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
          条件 && binding.value();
        });
      }
    }
  }

対応するデータ関数

エクスポートデフォルト{
  データ() {
    戻る {
      関連Open: false,
      options: [] /* ドロップダウンボックスの値を選択する */,
      コースリスト: [],
      範囲番号: 10,
      searchLoad: false /* ドロップダウンボックスの読み込み状態*/,
      価値: ""、
      タイマー: null
    };
  },
  作成された() {
    オプションを取得します。
  },
  メソッド: {
    // オンデマンドロード loadMore(n) {
      戻り値 () => (this.rangeNumber += 5);
    },
    // コースウェアをフィルタリングする filterMethod(query) {
      this.timer != null の場合、 this.timer のタイムアウトをクリアします。
      !this.searchLoad && (this.searchLoad = true);
      this.timer = setTimeout(() => {
        this.options = !!query ? this.courseList.filter(el => el.value.toLowerCase().includes(query.toLowerCase())): this.courseList;
        タイムアウトをクリアします(this.timer);
        this.searchLoad = false;
        this.rangeNumber = 10;
        this.timer = null;
      }, 500);
    },
    // 選択ドロップダウンボックスの表示と非表示をリッスンする visibleChange(flag) {
      // 表示時にリストフラグを初期化します && this.filterMethod("");
      // デフォルト値を初期化します this.rangeNumber = 10;
    },
    // オプションを取得する async getOptions() {
      searchCourseware() を待機します。その後 (res => {
        リストを res.data とします || [];
        // デフォルトで表示されるデータ this.options = list;
        // 元のデータ this.courseList = list;
      });
    }
  }
}

注記:

  • タイマーの役割は、フィルタリングされたキーワードが頻繁に入力され、データがタイムリーに応答しなくなるのを防ぐことです。すべてのデータが一度に取得されるため、タイマーはデータのレンダリングと読み込みにのみ使用されます。
  • セレクタのイベント機能は、主に「フォーカスを取得」および「フォーカスを失う」ときにデフォルトの表示データを初期化するために使用されます。ネットワーク要求の場合は、ここで「関数のインターセプト」処理が必要であり、インターフェース要求の数を減らすことが目的です。

要約:

新しい仕事環境に変わり、バックエンドの管理システムに携わるようになりました。多かれ少なかれ、さまざまな問題に遭遇するでしょう。いつものように、開発中に遭遇した問題をメモに記録します。良い記憶力は悪いペンほど良くありません。今種を植えて、来年の秋に実を結びたいと思っています。 JY

Element での最適化された複数選択データ読み込みの実装に関するこの記事はこれで終わりです。より関連性の高い Element 複数選択データ読み込みコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • element-uiの選択ドロップダウンボックスにスクロール読み込みを追加する

<<:  Pycharmとsshリモートアクセスサーバーdockerの詳細なチュートリアル

>>:  MySQLでカンマ区切り値の列を列に変換する方法

推薦する

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 1.2 クロージャのメモ化: 関数は定義された環境を記憶する1....

IE イメージ ツールバーを無効にする

IE6 で試してみたところ、ツールバーが表示されました。オプションに「イメージ ツールバーを有効にす...

Docker で Node.js をデプロイする方法

序文プロジェクトでは中間層としてNodeを使用し、Nodeのデプロイにはdockerを使用します。こ...

Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現

目次背景メタバースとは何ですか?成果を達成するトライアル 1: THREE.TorusGeometr...

レスポンシブ Web デザインが価値のない 5 つの理由

この記事は Tom Ewer の Managewp ブログからのもので、現在人気のレスポンシブ デザ...

Alibaba Cloud Ubuntu 16.04でpptpdサービスを構築する方法

1. PPTP VPNを構築するには、ポート1723とGREプロトコルを開く必要があります。 1. ...

Maxwell を使用して MySQL データをリアルタイムで同期する方法

目次マクスウェルについてMaxwellの設定と使用1. Maxwellインストールパッケージをダウン...

JavaScript BOM の説明

目次1. BOMの紹介1. JavaScriptは3つの部分から構成される2.ウィンドウオブジェクト...

jQuery における Ajax の関連知識ポイントのまとめ

序文JavaScriptを学ぶ学生は、 AJAX (非同期JavaScriptとxml) 変換は非同...

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

Docker に MySQL をデプロイする例

目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...

Tomcatの自動シャットダウンに関するバグ修正

序文最近、4 年間実行されている Java EE Web プロジェクトでは、システムが開けないという...

40 CSS/JSスタイルと機能的な技術処理

1-ドロップダウン選択ボックスのスタイル設定 - ドロップダウン リストを変更します。 2- <...

Ubuntu 20.04 LTS で Java 開発環境を構成する

Java開発キットjdkをダウンロードするJDK のダウンロード アドレスはhttp://www.o...