序文最近は、いつも延々とスワイプしています。 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アドレスを設定するための完全な手順
高い同時実行性とは何ですか?デフォルトの Linux カーネル パラメータは、最も一般的なシナリオ向...
1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...
ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...
今日、docker で redis 環境を構築していたところ、yum がリソースを取得できず、インタ...
この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...
序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...
導入同社の最近の Vue フロントエンド プロジェクトの要件: ポップアップ ウィンドウのドラッグ、...
1. SSHリモート管理SSH はセキュア チャネル プロトコルであり、主にリモート ログイン、リモ...
Flex レイアウトを使用すると、水平に配置すると、すべての子項目の高さが同じになることがわかります...
MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...
/****************** * 高度な文字デバイス ドライバー ***********...
前回の記事では、MySQL データ保存手順パラメータの詳細な例を紹介しました。今日は、JSON デー...
目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...
Keepalive は Vue プロジェクトでのキャッシュによく使用され、基本的な要件を満たすのに非...
カーネル 2.6 の時代には、アクセス制御セキュリティ ポリシーのメカニズムを提供するために新しいセ...