要素シャトルフレームのパフォーマンス最適化の実装

要素シャトルフレームのパフォーマンス最適化の実装

背景

シャトル ボックスが大量のデータを処理すると、レンダリングされる DOM ノードが多すぎるためにページが停止することがあります。
コンポーネントの元のロジックをできるだけ変更せずに最適化します。

解決

遅延読み込み - InfiniteScroll コンポーネントは、最初にパッケージ/転送から元のコンポーネントをコピーします (または、ソース コードを変更して、プライベート ライブラリの使用を維持するために再パッケージ化します)
意思

v-infinite-scroll="ページダウン"
:infinite-scroll-immediate="false"

に追加

<el-チェックボックスグループ
        v-show="!hasNoMatch && data.length > 0"
        v-model="チェック済み"
        :size="サイズ"
        :class="{ 'is-filterable': フィルタ可能 }"
        クラス="el-transfer-panel__list"
        v-infinite-scroll="ページダウン"
        :infinite-scroll-immediate="false"
      >
        <el-チェックボックス
          クラス="el-transfer-panel__item"
          :label="item[キープロパティ]"
          :disabled="アイテム[disabledProp]"
          :key="アイテム[キープロパティ]"
          v-for="filteredData 内のアイテム">
            <オプションコンテンツ:オプション="項目"></オプションコンテンツ>
        </el-チェックボックス>
</el-チェックボックスグループ>

data: 20 で pageSize を定義して、ページあたりのデータ数を示します。showData: [] は表示のみに使用され、上記のコードで操作する実際のデータを置き換えます。filteredData

 v-for="showData 内の項目">

同時に、時計の対応する処理

データ(データ){
    const チェック = [];
    this.showData = data.slice(0, this.pageSize);

    const フィルターデータキー = this.filteredData.map(
    (アイテム) => アイテム[this.keyProp]
    );
    this.checked.forEach((item) => {
    if (filteredDataKeys.indexOf(item) > -1) {
        チェック済み.push(アイテム);
    }
    });
    this.checkChangeByUser = false;
    this.checked = チェック済み;
},
フィルターされたデータ (フィルターされたデータ) {
    this.showData = フィルタリングされたデータ.slice(0, this.pageSize);
 }

初期表示数量はランダムで20個となります。

最後に、一番下までスクロールしたときに呼び出されるメソッドを追加します

ページダウン(){
    定数 l = this.showData.length;
    定数 totalLength = this.filteredData.length
    l < 合計長さ && 
    (this.showData = this.filteredData.slice(0, l + this.pageSize > totalLength ?
    合計長さ: l + this.pageSize));
},

下にスクロールすると、表示されるデータの長さが 20 ずつ増加します (数字は任意)。超過すると最大長が表示されます。

これにより、大量のデータを扱う際の操作速度低下の問題が基本的に解決されます。プレゼンテーション層とロジック層が分離されているため、コンポーネントのすべての操作ロジックを変更する必要がなく、差異が最小限に抑えられます。

新しい質問

リストの最後まで手動でスクロールしてから検索すると、依然として遅延が発生します。

高度な

スクロール処理中は、上部のデータは表示されません。このデータは表示されず、ユーザー エクスペリエンスに影響はありません。
したがって、現在のページで表示する必要があるデータは 20 個だけです。

スクロール バーを操作するために、el-checkbox-group に ref=scrollContainer を追加します。

現在のページ番号curIndex: 1をデータに定義します

そしてpageDownメソッドを修正する

    ページダウン(){
      定数 totalLength = this.filteredData.length
      if((this.curIndex*this.pageSize) < 合計長さ){
        this.curIndex++
        定数 targetLength = this.curIndex * this.pageSize 
        const endPoint = targetLength > totalLength ? totalLength : targetLength
        const startPoint = endPoint - this.pageSize > 0 ? endPoint - this.pageSize : 0
        this.showData = this.filteredData.slice(startPoint, endPoint);
        this.$refs.scrollContainer.$el.scrollTop = "1px" //バーを一番上までスクロールして次のページに接続します。0 は境界の問題を引き起こす可能性があります。}
    }

これを行うには、ページを上にするメソッドも追加する必要があります。

InfiniteScrollコマンドは下方向のスクロールのみを提供します。このコマンドを拡張して、上方向のスクロールリスナーを追加することができます。
        this.$refs.scrollContainer.$el.addEventListener('スクロール'、this.pageUp)
    },
    beforeDestroy(){
        this.$refs.scrollContainer.$el.removeEventListener('scroll', this.pageUp)
    },

pageUpメソッドを登録する

    ページアップ(e){
      if(e.target.scrollTop === 0 && this.curIndex> 1){
        this.curIndex --
        定数エンドポイント = this.curIndex * this.pageSize 
        定数 startPoint = (this.curIndex-1)* this.pageSize 
        this.showData = this.filteredData.slice(startPoint, endPoint);
        const el = this.$refs.scrollContainer.$el
        el.scrollTop = el.scrollHeight - el.clientHeight - 1 // 一番下までスクロールして前のページに接続します。-1 にすると境界の問題を回避できます。
      }
    },

データ操作を行うと、ページの内容が変わり、それに応じてスクロール バーも変わります。予期しないページめくりを防ぐために、データが変更されると、スクロール バーと現在のページ番号がリセットされます。

    initScroll(){
        this.curIndex = 1
        this.$refs.scrollContainer.$el.scrollTop = 0
    },

同時に、watchの対応する時間にinitScrollを実行します。

    データ(){
        ...
        this.initScroll()
        ...
    },
    フィルターされたデータ (フィルターされたデータ) {
      ...
      this.initScroll()
    }

この時点で、大量のデータに対するシャトル フレームのパフォーマンスが大幅に向上しました。

エレメントシャトルボックスのパフォーマンス最適化の実装に関するこの記事はこれで終わりです。エレメントシャトルボックスのパフォーマンス最適化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue はオンデマンドでシャトルフレームを転送する要素を導入しました
  • 大量のデータを含むエレメントのシャトルボックスで「すべて選択」をクリックするとスタックする問題の解決方法

<<:  不規則な投影を実現するためのボックスシャドウとドロップシャドウのサンプルコード

>>:  MySQL リンクを表示し、異常なリンクを削除する方法

推薦する

CSS3は、大きな円のドット分布と回転効果を実現するためにtransform-originを使用します。

まず、transform-origin 属性を使用する必要があります。transform 属性は必ず...

モバイルページで縦画面を強制する方法

最近、仕事でモバイルページを作成しました。もともと特別なことではありませんでしたが、非常に奇妙に感じ...

MySQLの一般クエリログとスロークエリログの分析

MySQL のログには、エラー ログ、バイナリ ログ、一般クエリ ログ、スロー クエリ ログなどが含...

PCとモバイルの適応の問題に対する迅速な解決策

Web ページを作成する場合、通常、コンピューターの画面サイズと携帯電話の画面サイズの違いなどの問題...

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...

MySQLインストーラがコミュニティモードで実行されている場合の解決策

今日、リモートデスクトップを実行してログインしているときにこのプロンプトを見つけました「MySQL ...

VueはAmapを使用して都市の位置特定を実現

この記事では、Amapを使用して都市の位置特定を実現するVueの具体的なコードを参考までに共有します...

Nginx 最適化サービスで Web ページ圧縮を実装する方法

リソースを節約するためにWebページの圧縮を設定する1.まず、設定を変更しましょう vim /usr...

Nginx Webサーバーのサンプルコードの設定方法の詳細な説明

概要今日は主に、NGINX を Web サーバーとして設定する方法を共有します。内容は次のとおりです...

幅と高さが可変の要素を中央に配置するための CSS ソリューション

1. 水平中央公開コード: html: <div class="parent&quo...

コンテンツウェブページの画像プレビューのデザイン

<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...

Kubernetes (k8s) 入門

Kubernetes は面白そうだったので(ギリシャ人なら名前に問題があると思うでしょうが)、ずっと...

docker を使用して crownblog プロジェクトを Alibaba Cloud にデプロイする方法

フロントエンドプロジェクトのパッケージ化.env.productionを見つけて、自分のIPまたはド...

DockerはMariaDBのサブライブラリとサブテーブル、および読み書き分離機能を実装します

目次1. はじめに2. 環境整備1. 基本環境3.Mysqlマスタースレーブ構成をインストールする1...