序文最近は、いつも延々とスワイプしています。 Weibo をチェック、Tik Tok をチェック、Boiling Point をチェック... それぞれのスムーズなスクロール体験の背後には、フロントエンド エンジニアの献身があります。 この記事では、Vue.js に基づく無限ドロップダウン リストの実践について説明します。 私たちの目標は、リストが読み込まれるまで待つという従来の経験ではなく、リストのプルダウン プロセスをスムーズにすることです。
デザイン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; }); } 検索メソッドが記述されたので、次のステップはそれを呼び出すことです。
// エンドレスリスト.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の他の関連記事にも注目してください! 以下もご興味があるかもしれません:
|
>>: Ubuntu 18.04 LTSでIPアドレスを設定するための完全な手順
1. .shファイルを実行する./sh ファイルを使用して直接実行することもできますが、現在のターミ...
少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...
大量のデータを扱うシステムの中には、クエリ効率の低さやデータの保存時間の長さといったデータベースの問...
UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...
構文: <marquee> …</marquee>モバイル属性マーキーを使用...
まず、このブログのケースデモンストレーション テーブルを作成します。 create table a(...
コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...
凡例コンポーネントは、ECharts でよく使用されるコンポーネントです。シリーズ マーカーの名前を...
MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...
序文403 クロスオリジン エラーが発生しNo 'Access-Control-Allow-...
カルーセルを作りたい場合、まずその原理を理解する必要があります。画像を右から左にスライドさせるにはど...
この記事では、JD.comのフラッシュセール効果を実現するためのJavaScriptの具体的なコード...
目次1. 配列の平坦化の概念2. 実装1. 減らす2. toString と split 3. 結合...
目次1. CDNの紹介1.1 react (最初にインポート) 1.2 react-dom(後ほど紹...
この記事では、MySQL の sql_mode モードについて例を挙げて説明します。ご参考までに、詳...