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...

mysql5.7.21 の異常起動を修正する方法

同僚から、停電のため MySQL インスタンスを起動できないという報告がありました。 innodb_...

Vueルーティングルーターの詳細な説明

目次ルーティングプラグインをモジュール方式で使用するルートの使用宣言型ナビゲーションプログラムによる...

Jira リバース プロキシを実装するための nginx について

概要: nginx リバース プロキシ jira を構成し、https を実装します。Tomcat ...

MySQL で結果を選択して更新を実行する例のチュートリアル

1. 単一テーブルクエリ -> 更新 テーブル名の更新 フィールド1=新しい値1、フィールド2...

ヘッダーのチェックボックスをテキスト実装コードに変更するための選択テーブルを持つ要素

方法1: テーブル属性を使用する: header-cell-class-name テーブルインターフ...

MySQL はリレーショナルデータベースですか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

カレンダー効果を実現するJavaScript

この記事では、カレンダー効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

Centos6.9 インストール Mysql5.7.18 ステップ記録

インストール手順 rpm -ivh mysql-コミュニティ-共通-5.7.18-1.el7.x86...

JSで画面録画機能を作成する

OBS studioかっこいいですが、 JavaScriptもっとかっこいいです。では、 JavaS...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...

Mysql でサーバーの UUID を変更する方法

問題の原因:スレーブサーバーがクローンマスターサーバーである場合、server-uuidの値は同じで...

MySQLデータベースの管理者パスワードを忘れた場合の解決策

1. コマンド mysqld --skip-grant-tables を入力します (前提条件: m...