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

推薦する

SELinux 入門

カーネル 2.6 の時代には、アクセス制御セキュリティ ポリシーのメカニズムを提供するために新しいセ...

MySQLの大文字と小文字の区別によって発生する問題の分析

MYSQLは大文字と小文字を区別します言葉を見れば信じられます。タイトルを見れば内容がわかります。 ...

仮想マシンUbuntu 16.04がインターネットに接続できない問題の解決策

Ubuntu をインストールしたばかりですが、開いたときにネットワーク接続がありませんでした。右上隅...

自動検索提案機能のスタイルファイルを入力します: suggestion.css

コードをコピーコードは次のとおりです。 .sugLayerDiv{位置:相対; overflow:h...

Tomcat が https アクセスをサポートするための手順の説明

tomcat を https アクセスに対応させる方法ステップ: (1)キーストアファイルを生成する...

vue-router 4 の使用例の詳しい説明

目次1. インスタンスをインストールして作成する2. vue-router4の新機能2.1 動的ルー...

Linux システムによって報告される tcp_mark_head_lost エラーの処理方法

問題の説明最近、ホストから次のカーネル情報が報告されました。 7月8日 10:47:42 cztes...

Linux での JDK と Tomcat のアップロードと設定に関する詳細なチュートリアル

準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...

Dockerの基礎

序文: Docker はオープンソースのアプリケーション コンテナ エンジンであり、開発者はこれを使...

MySQL で行を列に変換したり、列を行に変換したりする詳細な例

mysql 行から列へ、列から行へ難しい文章ではないので、詳しく説明はしません。文章を読むときは、一...

ミニプログラムは、カスタムのマルチレベル単一選択と複数選択を実装します

この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...

MySQL 子テーブルで外部キー制約チェックを無効にする方法

準備する:教師テーブルと生徒テーブルを定義し、生徒テーブルで教師テーブルIDを参照します。テーブルt...

Docker で Ubuntu に Python3 と Pip をインストールする際の問題

文章1) Ubuntuイメージをダウンロードする docker プル Ubuntu 2) 画像を見る...

JSでよく使われるデータ処理方法

目次DOM処理配列方法要約するDOM処理DOM はドキュメントの構造化された表現を提供し、スクリプト...