el-table のテーブルを最適化するために仮想リストを使用する方法についての簡単な説明

el-table のテーブルを最適化するために仮想リストを使用する方法についての簡単な説明

序文

テーブルをよく使用します。データ量が多い場合は直接ページ区切りで表示できますが、1 ページに多くの項目を表示する必要がある場合や、ページ区切りが不要な場合も避けられません。

このとき、表示だけであれば問題ありませんが、リストが編集可能になっていると非常に固まってしまいます。ドロップダウンボックスをクリックしても、ポップアップするまでに時間がかかります。これはユーザーの使用に大きな影響を与えます。

解決

  • まず、ページのフリーズの原因がデータの読み込みの遅さにあるのではないかと考え、スクロール読み込み方式を採用しました。データを取得後、まずは100個のデータを読み込みました。スクロールしながらページにデータを読み込むことで、最初に読み込むデータが多すぎるという負担を軽減できます。最初は問題なかったのですが、データが増えていくにつれて、テーブル内の編集可能なドロップダウン ボックスをクリックしたときにページが停止していることがはっきりとわかりました。
  • 後から思ったのは、ページ上で見える範囲のデータだけをロードすれば、ページの遅延の問題は解決するはずだということでした。

具体的な実装

読み込み時に10/20個のデータ(各行の高さ/ページ表示データの高さ、または固定値で計算可能)を取得し、スクロール時にスクロールバーを監視し、スクロール距離に基づいて表示ページのデータを計算します。

満たすべき前提条件

リストの合計の高さ

合計データ長 × 各行の高さ

ページの高さが表示されている高さしかない場合、スクロールして新しいデータを取得することはできません。

各行の高さ

高さが固定されている場合は、ハード値を書き込むことができます。高さが動的な場合は、計算することができます。

スクロールオフセット

現在のスクロール距離 - (現在のスクロール距離 % 各行の高さ)

ページに表示されるデータの開始インデックスと終了インデックス

開始インデックスは最初は0です
スクロール処理中、開始インデックス = Math.floor (現在のスクロール距離 / 各行の高さ)

コードステップ

<div class="main-inner-content">
    <el-table :data="visibleData" :style="{'min-height': gradingEditor ? listHeight+'px':'100%'}" id="dataTable">

    </el-table>
</div>

計算: {
        // // リストの合計の高さ listHeight () {
            // tableData はインターフェースの合計データです。 return this.tableData.length * this.itemSize;
        },
        // //オフセットに対応するスタイル
        getTransform() {
            `translate3d(0,${this.startOffset}px,0)` を返します。
        },
        //実際の表示リストデータを取得する visibleData () {
            tableBody = document.querySelector('#dataTable >.el-table__body-wrapper') とします。
            if (テーブル本体) {
                tableBody.style.transform = this.getTransform
            }
            this.tableData.slice(this.start, Math.min(this.end, this.tableData.length)) を返します。
        }
    },
データ() {
    戻る {
        テーブルデータ:[],
        //オフセット開始オフセット: 0,
        //開始インデックス start: 0,
        //終了インデックス end: null,
    };
},
方法:{
    ハンドルスクロール(){
        // これはスクロール ボックスです。スクロール位置がテーブルの場合は、それに応じて変更するだけです。オフセットを割り当てる場所もあります。let scrollTop = document.getElementById('main-inner-content').scrollTop;
        // // この時点での開始インデックス this.start = Math.floor(scrollTop / this.itemSize);
        this.start < 0 の場合、 this.start = 0;
        // //この時点での終了インデックス this.end = this.start + 10;
        // //この時点でのオフセット this.startOffset = scrollTop - (scrollTop % this.itemSize);
        this.startOffset = this.startOffset > this.itemSize ? this.startOffset - this.itemSize : 0;
    }
},
マウントされた(){
    window.addEventListener("スクロール", this.handleScroll, true);
},
破壊された()
    window.removeEventListener('scroll', this.handleScroll, true) // スクロールバーのスクロールイベントをクリアします}

ページがスクロールすると、10 個のデータのみが読み込まれ、オフセットによってページの表示が決定されます。

質問

el-table 全体の合計の高さを設定し、次に下のリスト項目のボックスのオフセットを設定します。ページを更新せずにデータを再取得する必要がある場合 (ページングなど)、データを初期化する必要があります。そうしないと、ページに以前のデータが直接表示されるか、ページが空白になります。

document.querySelector('#main-inner-content').scrollTop = 0
this.start = 0
this.startOffset = 0
this.end = this.start + 10;
tableBody = document.querySelector('#dataTable >.el-table__body-wrapper') とします。
tableBody.style.transform = this.getTransform

計算と使用の便宜上、ページの各行の高さを固定し、余白を省略する方法を使用していますが、プレリリース環境を展開した後、コード -webkit-box-orient: vertical が直接消えて表示されないことがわかります。
解決策: インラインスタイル style="-webkit-box-orient: vertical" と記述すると機能します

.省略テキスト{
    単語折り返し: 単語を区切る; 
    オーバーフロー: 非表示; 
    テキストオーバーフロー: 省略記号; 
    ディスプレイ: -webkit-box; 
    -webkit-box-orient: 垂直;  
    -webkit-line-clamp: 2; 
}

参照する
https://juejin.cn/post/6844903982742110216#heading-4
https://codesandbox.io/s/virtuallist-1-forked-sd2xn?file=/src/components/VirtualList.vue:1487-1652

これで、el-table の仮想リストを使用してテーブルを最適化する方法に関するこの記事は終了です。el-table の最適化に関するその他のコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)
  • el-table ツリーテーブルフォーム検証 (リスト生成シーケンス番号)
  • VUE2.0+ElementUI2.0 テーブル el-table はヘッダー拡張 el-tooltip を実装します
  • VUE2.0+ElementUI2.0 テーブル el-table loop 動的列レンダリングの書き方を詳しく解説
  • VUE2.0 ElementUI2.0 テーブル el-table 適応高さ実装方法

<<:  MySQL データベース設計 3 つのパラダイム例分析

>>:  ドッカー専用倉庫港湾建設プロセス

推薦する

Vueが学生管理機能を実装

この記事では、学生管理を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次の...

Zabbix上のすべてのホストのIPとホスト名を取得する

ザビックスZabbix ([`zæbiks]) は、WEB インターフェースに基づいて分散システム監...

MySQL でのログインを取り消す

コンセプト紹介: MySQL の redo ログにはトランザクションの動作が記録されることはご存じの...

MySQL レプリケーションの原理と実際のアプリケーションの詳細な説明

この記事では、例を使用して、MySQL レプリケーションの原理と実際のアプリケーションについて説明し...

Linux の fsevents モジュールによって発生する npm ls エラーの解決方法の詳細な説明

Mac で開発されたプロジェクトがあり、パッケージ npm i がインストールされており、すべて正常...

Vuexの補助関数の使い方

目次マップ状態マップゲッターマップミューテーションマップアクション複数のモジュールマップ状態 ...

Vue 値転送の 12 の方法の概要

目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

Linux のインスタンスにパブリック IP アドレスを割り当てる方法

説明するこのインターフェースを呼び出すときは、次の点に注意する必要があります。パブリック IP アド...

CSS の優先順位に関する詳細な紹介

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

画像内のrarファイルを隠す方法

このロゴを .rar ファイルとしてローカルに保存し、解凍して効果を確認することができます。よりシン...

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

CSS3は、Transformを使用して動く2D時計を作成します。

これでtransformコースは終了です。例を見てみましょう。transform transform...

Nginx に React プロジェクトをデプロイする方法の例

テストプロジェクト: react-demo react-demo プロジェクトをサーバーにクローンし...

Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する

マスタースレーブレプリケーションモードのクラスターでは、通常、1 つのマスターノードと 2 つ以上の...