Vue 仮想リストの実例

Vue 仮想リストの実例

序文

最近は、いつも延々とスワイプしています。 Weibo をチェック、Tik Tok をチェック、Boiling Point をチェック... それぞれのスムーズなスクロール体験の背後には、フロントエンド エンジニアの献身があります。

この記事では、Vue.js に基づく無限ドロップダウン リストの実践について説明します。

私たちの目標は、リストが読み込まれるまで待つという従来の経験ではなく、リストのプルダウン プロセスをスムーズにすることです。

  • Better Programmingからの翻訳
  • オンラインデモ

デザイン

Vue CLI を使用してプロジェクトをすばやくビルドしてみましょう。

これがメインページです:

// エンドレスリスト.vue

<テンプレート>
 <div class="無限スクロールリスト">
  <!-- 検索ボックス -->
  <div class="検索ボックス">
   <input type="text" v-model="検索クエリ"/>
  </div>
  <p class="center" v-if="results.length == 0 && !loading">
   何かを検索するには入力を開始します。
  </p>
  <!-- 仮想リスト -->
  <仮想リスト
   :data-key="'ページID'"
   :data-sources="結果"
   :data-component="アイテムコンポーネント"
   :ページモード="true"
   />
  <!-- 読み込み中 -->
  <loader v-if="読み込み中" />
 </div>
</テンプレート>

もちろん、核となるのは仮想リストコンポーネントです。

ここでの仮想リストには、Github で 2.5k 以上のスターを獲得しているサードパーティ ライブラリ Vue Virtual Scroll List を使用します。 react の react-virtualized ライブラリに類似しています。

DOM 要素の数が多いと、Web ページが非常に「重くなる」ことになります。 DOM が 1500 ~ 2000 要素を超えると、特に小型で低速なデバイスではページの表示が遅くなり始めます。

無限にスクロールするページがあると想像してください。下に引っ張り続けると、実際には数万の DOM 要素が形成され、それぞれに子ノードが含まれることになり、パフォーマンスが大幅に低下します。

仮想スクロールツールはこの問題を解決するために存在します。

上の写真の通り、明記してあります。リストは表示領域とバッファ領域に分かれています。この範囲外のリスト DOM は削除されます。

さあ、準備は整ったので、始めましょう!

成し遂げる

// imports.js (EndlessList.vue)

'axios' から axios をインポートします。
'lodash' から lodash をインポートします。
'vue-virtual-scroll-list' から VirtualList をインポートします。
'./SearchResult' から SearchResult をインポートします。
'./Loader' から Loader をインポートします。
エクスポートデフォルト{
 名前: 'EndlessList',
 コンポーネント:
  バーチャルリスト、
  ローダ
 },
 データ() {
  戻る {
   検索クエリ: ''、
   現在のページ: 0,
   結果: []、
   項目コンポーネント: SearchResult、
   読み込み中: false
  }
 },
};

後で使用するために、サードパーティのライブラリ axios と loadsh を導入します。

このうち、itemComponent は virtual-list のプロパティなので、検索結果ユニットとして新しい SearchResult サブコンポーネントを作成する必要があります。

コードは次のとおりです。

// 検索結果.vue

<テンプレート>
 <div class="リスト項目">
  <h3>
   {{ソース.title}}
  </h3>
  <div v-html="source.snippet"></div>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 小道具: {
  索引: {
   // 現在のアイテムのインデックス
   タイプ: 数値、
  },
  ソース: {
   タイプ: オブジェクト、
   デフォルト() {
    戻る {};
   },
  },
 },
};
</スクリプト>

<スタイルスコープ>
.リスト項目{
 パディング: 0 10px 20px 10px;
}
.リスト項目 h3 {
 マージン: 0;
 パディング下部: 10px;
}
</スタイル>

タイトルや説明を検索することで結果を取得できます。リクエストデータは Wikipedia から取得されます。

検索(クエリ、ページ) {
 // Wikipedia API が期待するデータを準備します。
 定数データ = {
  アクション: "クエリ"、
  フォーマット: "json",
  リスト: "検索",
  続行: "-||",
  utf8: 1,
  srsearch: クエリ、
  sroffset: ページ * 10、
  起源: "*"、
 };
 // そして、これらのパラメータをGETパラメータの形式に変換します
 // アクション = クエリ & フォーマット = json ...
 定数パラメータ = Object.keys(データ)
  .map(関数(k) {
   戻りデータ[k] == ""
    ?「」
    : encodeURIComponent(k) + "=" + encodeURIComponent(data[k]);
  })
  。参加する("&");
 // パラメータ文字列を含むURLを準備します
 const searchUrl = `https://en.wikipedia.org/w/api.php?${params}`;
 // ローダーを表示できるように、loading を true に設定します 
 this.loading = true;
 // 次にリクエストを実行し、結果を連結します
 axios.get(searchUrl).then((レスポンス) => {
  this.results = this.results.concat(response.data.query.search);
  // もちろん、ローダーを非表示にするには、loading を false に設定します。
  this.loading = false;
 });
}

検索メソッドが記述されたので、次のステップはそれを呼び出すことです。

  1. これは、ユーザーが検索を入力したときに呼び出されます。
  2. プルダウンすると呼び出されます。

// エンドレスリスト.vue

<スクリプト>
エクスポートデフォルト{
 // 簡潔にするため、data() とメソッドは省略します
 時計:
  検索クエリ: {
   即時: true、
   ハンドラ: lodash.debounce(function (newVal) {
    (newVal == "") の場合 {
     戻る;
    }
    this.results = [];
    this.currentPage = 0;
    this.search(newVal, this.currentPage);
    this.search(newVal, this.currentPage + 1);
    this.currentPage = 2;
   }, 200),
  },
 },
 マウント() {
  定数 vm = this;
  window.onscroll = lodash.debounce(function() {
   var 下からの距離 =
    document.body.scrollHeight - window.innerHeight - window.scrollY;
   if (distanceFromBottom < 400 && vm.searchQuery !== "") {
    vm.search(vm.searchQuery, vm.currentPage);
    vm.currentPage++;
   }
  }, 100, {leading: true});
 },
}
</スクリプト>

当然のことながら、searchQuery が変更されると、新しい検索結果が得られます。もちろん、ここの入力ボックスでも手ぶれ補正機能を使用します。

注目すべきもう 1 つの点は、最初の検索では 2 ページ分の結果を読み込むことで、ユーザーがスクロールできる余地を確保し、スムーズな操作感を維持できることです。

スクロールイベントに手ぶれ防止機能も追加しました。ここで質問です: window.onscroll イベントで leading を true に設定する必要があるのはなぜですか?

次に、プログラムを実行して効果を確認します。

npm 実行 dev

どうやって?めちゃくちゃスクロールしない限り、読み込みのプロセスは基本的に感じません〜

まとめ

ユーザーは、10 件の結果を下にスクロールするたびに、10 件の新しい結果が読み込まれるのを待ちたくありません。そのため、引き下げられる前に底を予測し、事前にロードするためのバッファが必要です。これがシルキーな体験の核心です。

もちろん、ビューエリアとバッファにない DOM 要素はすべて削除されます。これは、ページ上に大量の DOM 要素を形成しないことの本質でもあります。

このような動的な処理リストは、まさにプログラマーの知恵と配慮の表れです。

プロジェクトをローカルに複製して試してみることができます。以上が今回のシェアです〜

以上がVueバーチャルリストの実装例の詳細です。Vueバーチャルリストの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • 仮想リスト機能を実装するVueコード
  • Vueを使用して仮想リストを実装する方法
  • Vue マルチ選択リスト コンポーネントの詳細な説明
  • Vueはバックグラウンドから記事リストをレンダリングし、IDに応じて記事の詳細にジャンプします。
  • 詳細ページ操作のパラメータを含む Vue リスト ページ (router-link)
  • vue パブリック リスト選択コンポーネント、Vant-UI スタイルの参照
  • Vueはリストのドラッグとソートの機能を実装します
  • Vue はフロントエンドリストの複数条件フィルタリングを実装します
  • Vueは、「詳細を表示」ボタンをクリックして詳細リストをポップアップウィンドウに表示する操作を実装します。
  • Vue-Extensionとリストの下の詳細の折りたたみケース
  • Vueは円形スクロールリストを実装します

<<:  MySQLイベント計画タスクに関する簡単な説明

>>:  Ubuntu 18.04 LTSでIPアドレスを設定するための完全な手順

推薦する

Linux でバックグラウンドで実行中のプログラムを表示して終了する方法

1. .shファイルを実行する./sh ファイルを使用して直接実行することもできますが、現在のターミ...

HTML 順序なしリスト 箇条書き 画像を使用した CSS の記述

少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...

MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明

大量のデータを扱うシステムの中には、クエリ効率の低さやデータの保存時間の長さといったデータベースの問...

MySQL複合クエリの詳細な説明

UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...

HTMLのmarquee属性でテキストを踊らせる

構文: <marquee> …</marquee>モバイル属性マーキーを使用...

Mysql マルチテーブル結合クエリの実行の詳細について簡単に説明します。

まず、このブログのケースデモンストレーション テーブルを作成します。 create table a(...

IEのクラッシュバグ

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

Echarts 凡例コンポーネントのプロパティとソース コード

凡例コンポーネントは、ECharts でよく使用されるコンポーネントです。シリーズ マーカーの名前を...

MySQL インストール図の概要

MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...

Nginx 構成 クロスドメイン リクエスト Access-Control-Allow-Origin * 詳細な説明

序文403 クロスオリジン エラーが発生しNo 'Access-Control-Allow-...

JavaScript Domはカルーセルの原理と例を実装します

カルーセルを作りたい場合、まずその原理を理解する必要があります。画像を右から左にスライドさせるにはど...

JD.com フラッシュセール効果を実現する JavaScript

この記事では、JD.comのフラッシュセール効果を実現するためのJavaScriptの具体的なコード...

配列をフラット化する 5 つの JavaScript の方法

目次1. 配列の平坦化の概念2. 実装1. 減らす2. toString と split 3. 結合...

Reactの簡単な紹介

目次1. CDNの紹介1.1 react (最初にインポート) 1.2 react-dom(後ほど紹...

MySQL の sql_mode モード例の詳細な説明

この記事では、MySQL の sql_mode モードについて例を挙げて説明します。ご参考までに、詳...