序文最近は、いつも延々とスワイプしています。 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アドレスを設定するための完全な手順
input と img を同じ行に配置すると、img タグが常に input より 1 つ上になり、...
これまで react.forwardRef は react の高階コンポーネントには適用できませんで...
conda アップデート conda pip で tf-nightly-gpu-2.0-previ...
インストールインストールするには、次のコマンドを入力します。 // ネプ npm で react-r...
Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...
目次1. Ant Design Vueを統合する2. コンポーネントの使用1. 完全な引用2. コン...
MySQL 5.7 には、オンライン DDL、マルチソース レプリケーション、拡張された半同期、テー...
この記事では、電子商取引プラットフォームで商品の詳細を表示する一般的な例を紹介します。たとえば、ある...
Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...
目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...
まず、データベース パーティショニングとは何でしょうか?以前、MySQL のテーブル パーティショニ...
1. MySQLをインストールします。対応するソフトウェアをインストールするには、次の 3 つのコマ...
CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...
主にインストール後に my.ini ファイルを確認するために、msi 形式でインストールしました。フ...
この記事では、例を使用して、MySQL で複数テーブルの関連統計を実装する方法について説明します。ご...