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でカンマ区切り値の列を列に変換する方法

推薦する

MySQLクエリトランザクション処理へのノード接続の実装

目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...

Nginx ポート競合を解決するトラブルシューティング方法の例

問題の説明データ転送に Nginx を使用し、フロントエンドとバックエンドが分離された Spring...

JavaScript 組み込みオブジェクトの概要

目次1. 組み込みオブジェクト2. 数学オブジェクト1. Mathオブジェクトの使用2. 指定された...

Tencent Cloud Server での Jenkins の設定方法の詳細

目次1. Tencent Cloud Serverに接続する2. 環境整備Jenkinsのデプロイメ...

mysql 3つのテーブルを接続してビューを作成する

3 つのテーブルが接続されています。テーブル A のフィールド a はテーブル B のフィールド b...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

MySQL 5.7.25 圧縮版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.25圧縮版のインストールと設定方法を参考までに紹介します。具体的な...

現在のMySQL接続数を表示する方法の詳細な説明

1. 現在のすべての接続の詳細情報を表示します。 ./mysqladmin -uadmin -p -...

JavaScript の isPrototypeOf 関数

目次1. isPrototypeOf()例 1、オブジェクト クラス インスタンス:例 2: Hum...

HTMLのタグについての簡単な説明

0. タグとは何ですか? XML/HTML コードコンテンツをクリップボードにコピー<入力 t...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

JS WebSocket 切断理由とハートビートの仕組みの詳しい説明

1. 切断理由WebSocket が切断される理由は多数あります。WebSocket が切断されたと...

UCenter ホームサイトに統計コードを追加

UCenter Homeは、ComsenzがリリースしたSNSサイト構築システムです。最新バージョン...

Dockerの匿名マウントと名前付きマウントの具体的な使用法

目次データ量匿名マウントと名前付きマウントデータボリュームの場所データ量匿名マウントと名前付きマウン...