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

推薦する

Nginx10m+の高並列カーネル最適化に関する簡単な説明

高い同時実行性とは何ですか?デフォルトの Linux カーネル パラメータは、最も一般的なシナリオ向...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...

要素を中央に配置するための配置方法 (Web ページ レイアウトのヒント)

ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...

Dockerコンテナが外部ネットワークにpingできない問題を解決する

今日、docker で redis 環境を構築していたところ、yum がリソースを取得できず、インタ...

nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...

Linux における「!」の知られざる使用法のまとめ

序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...

Vueカスタム指示により、ポップアップウィンドウのドラッグ4辺ストレッチと対角ストレッチ効果を実現

導入同社の最近の Vue フロントエンド プロジェクトの要件: ポップアップ ウィンドウのドラッグ、...

Centos 7.4 でリモート アクセス制御を実装する方法

1. SSHリモート管理SSH はセキュア チャネル プロトコルであり、主にリモート ログイン、リモ...

フレックスレイアウトではサブアイテムの高さを維持できる

Flex レイアウトを使用すると、水平に配置すると、すべての子項目の高さが同じになることがわかります...

大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション

MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...

Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ

/****************** * 高度な文字デバイス ドライバー ***********...

MySQL 操作: JSON データ型の操作

前回の記事では、MySQL データ保存手順パラメータの詳細な例を紹介しました。今日は、JSON デー...

ディスク容量不足による MySQL レプリケーション障害の解決方法

目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...

vue keepAlive キャッシュクリア問題事例の詳細な説明

Keepalive は Vue プロジェクトでのキャッシュによく使用され、基本的な要件を満たすのに非...

SELinux 入門

カーネル 2.6 の時代には、アクセス制御セキュリティ ポリシーのメカニズムを提供するために新しいセ...