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アドレスを設定するための完全な手順

推薦する

Docker ケース分析: Redis サービスの構築

目次1 マウントディレクトリとファイルを作成する2 Redisイメージを取得する3 コンテナを作成し...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...

CentOS/RHEL システムで VLAN タグ付きイーサネット カードを使用する方法

シナリオによっては、Linux サーバー (CentOS/RHEL) の同じイーサネット カード (...

ウェブページを作るときに注意すべき5つのポイント

1. 色合わせの問題<br />Web ページには 3 色以上使用しないでください。そう...

HTML テーブル タグ チュートリアル (36): テーブル ヘッダーの背景色属性 BGCOLOR

<TH> タグは、テーブル内のヘッダーのプロパティを設定するために使用されます。以下の...

Win10でIIS10を構成し、ASPプログラムのデバッグをサポートする手順

マイクロソフトIIS (Internet Information Server) は、Microso...

Dockerイメージの作成、保存、読み込み方法

イメージを作成する方法は 3 つあります。既存のイメージに基づいてコンテナを作成する、ローカル テン...

JavaScript を使用して QR コードを解析する 3 つの方法

目次1. JavaScriptを使用してQRコードを解析する1. QR コードとは何ですか? 2.q...

JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガ...

vue2 vue3 での Echarts の詳細な使用方法

目次1. インストール2. vue2でEchartsを使用するmain.jsファイル内コンテナが与え...

MySQL のインデックス障害の一般的なシナリオと回避方法

序文これまでにも、一部の SQL ステートメントを不適切に使用すると MySQL インデックスが失敗...

スマートCSSを使用して、ユーザーのスクロール位置に基づいてスタイルを適用します。

現在のスクロール オフセットを html 要素の属性に追加することで、現在のスクロール位置に基づいて...

CSSはグラデーションを巧みに利用して高度な背景光アニメーションを実現します

成し遂げるこの効果は CSS を使用して完全に再現することは困難です。 CSS でシミュレートされた...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...

Alibaba Cloud Server の詳細な展開 (グラフィック チュートリアル)

最近、Web 開発のフロントエンドとバックエンドの技術を学んだので、その後の管理を容易にするためにプ...