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 つのパラダイム例分析

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

推薦する

MySQLデータベース移行により、大量のデータを迅速にエクスポートおよびインポートできます

データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...

MySQL ログインおよび終了コマンドの形式

mysql ログインのコマンド形式は次のとおりです。 mysql -h [hostip] -u [ユ...

Centos7でファイルをバックアップするときは、バックアップファイルにバックアップの日付を追加します

Linux は、システム内のデバイス、インターフェース、ファイル、スタートアップ、アプリケーション ...

動的および静的分離を実現する nginx のサンプルコード

1. nginxの動的と静的の分離の簡単な設定web1は静的サーバー、web2は動的サーバー、nod...

コンポーネントベースのフロントエンド開発プロセスの詳細な説明

背景<br />フロントエンドを担当する学生は、ページが多すぎると煩雑になるため、開発プ...

CSS3 で実装された価格表

結果: 実装コードhtml <div id="価格表" class=&qu...

Angularの単一プロジェクトを複数プロジェクトにアップグレードするプロセス全体

目次序文開発環境新しいプロジェクトを作成するモバイルウェブプロジェクト角度付きJSONパブリックモジ...

ウェブデザインと制作の一般的な原則をまとめる

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

NetEase ブログで使用されているシンプルな Web ページ コード

NetEase Blog でコードを使用する方法: まずブログにログインし、ブログのホームページの左...

Linuxネットワーク設定の基本操作コマンドを詳しく解説

目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...

遭遇したいくつかのブラウザ互換性の問題について簡単に説明します

背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...

データベースを削除して逃げる?xtraback を使用して MySQL データベースをバックアップする方法

1. mysqldump バックアップ方法では論理バックアップが使用されます。最大の欠点は、バック...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

HTML テーブルタグチュートリアル (17): テーブルタイトルの垂直配置属性 VALIGN

表のキャプションは表の上または下に配置でき、プロパティで調整できます。デフォルトのテーブル タイトル...

Ubuntu 20.04 に Python 3 仮想環境をインストールする詳細なチュートリアル

以下はすべて仮想マシン上で実行されます1. pip3をインストールするsudo apt で pyth...