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

推薦する

入力と画像を揃えるためにvertical-alignを使用します

input と img を同じ行に配置すると、img タグが常に input より 1 つ上になり、...

React forwardRefの使い方と注意点

これまで react.forwardRef は react の高階コンポーネントには適用できませんで...

Linux Tensorflow2.0のインストール問題を解決する

conda アップデート conda pip で tf-nightly-gpu-2.0-previ...

実用的なクイックスタートReactルーティング開発

インストールインストールするには、次のコマンドを入力します。 // ネプ npm で react-r...

高性能な HTML アプリケーションを作成するためのヒント

Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...

Vue3 (パート 2) Ant Design Vue の統合

目次1. Ant Design Vueを統合する2. コンポーネントの使用1. 完全な引用2. コン...

MySQL アップグレードのベストプラクティス

MySQL 5.7 には、オンライン DDL、マルチソース レプリケーション、拡張された半同期、テー...

JavaScriptはeコマースプラットフォームの製品詳細を実装します

この記事では、電子商取引プラットフォームで商品の詳細を表示する一般的な例を紹介します。たとえば、ある...

Dockerfileの指示と基本構造の説明

Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

MySQL パーティション関数の詳細な説明と例の分析

まず、データベース パーティショニングとは何でしょうか?以前、MySQL のテーブル パーティショニ...

クラウド サーバー Ubuntu_Server_16.04.1 に MySQL をインストールしてリモート接続を有効にする方法

1. MySQLをインストールします。対応するソフトウェアをインストールするには、次の 3 つのコマ...

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...

Win10 への MySQL 5.7 のインストール MSI 版のチュートリアル(画像とテキスト付き)

主にインストール後に my.ini ファイルを確認するために、msi 形式でインストールしました。フ...

MySQLは複数テーブル関連統計(サブクエリ統計)の例を実装します

この記事では、例を使用して、MySQL で複数テーブルの関連統計を実装する方法について説明します。ご...