Vue スクロールダウンしてさらにデータを読み込む スクロールケースの詳細な説明

Vue スクロールダウンしてさらにデータを読み込む スクロールケースの詳細な説明

vue-無限スクロール

インストール

npm インストール vue-infinite-scroll --save

公式もいくつかの読み込み方法を推奨していますが、「最もVueらしい」方法は間違いなくmain.jsに追加することです。

'vue-infinite-scroll' から infiniteScroll をインポートします。
Vue.use(無限スクロール)

実装例

公式のコード例では、ルート コンポーネントにコードを記述することを前提としています。実際には、子コンポーネントにコードを記述する必要があるため、コードも少し変更する必要があります。以下に、役立つコード スニペットのみを示します。

<div v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
    <div v-for="データ内のアイテム" :key="item.index">{{item.name}}</div>
</div>
 データ () {
    戻る {
      カウント: 0,
      データ: []、
      忙しい: false
    }
  }
メソッド: {
    ロードモア: 関数() {
      this.busy = true
      タイムアウトを設定する(() => {
        (var i = 0, j = 10; i < j; i++) の場合 {
          this.data.push({name: this.count++ })
        }
        コンソールログ(このデータ)
        this.busy = false
      }, 1000)
    }
  }

効果

デフォルトでは、10 行のデータが読み込まれます。ページの一番下までスクロールすると、1 秒後にさらに 10 項目が読み込まれます。その後、スクロールを続けると、さらに 10 項目が読み込まれます。以下のように表示されます。

オプションの説明

  • v-infinite-scroll="loadMore"コールバック関数がloadMoreであることを意味します
  • infinite-scroll-disabled="busy"は、変数busyによってloadMoreが実行されるかどうかが決まることを意味します。false false場合はloadMoreが実行され、 true場合は実行されません。busy はビ​​ジーを意味し、ビジーのときは実行されないことに注意してください。
  • infinite-scroll-distance="10"ここで、 10 、コールバック関数をトリガーする前にページがページの末尾から何ピクセル離れるかを決定します。10 10ピクセル値です。通常、ページの最後に数十ピクセルの高さの「読み込み中...」を作成します。この場合、この div の高さをinfinite-scroll-distanceの値に設定できます。

その他のオプション:

  • infinite-scroll-immediate-checkデフォルト値はtrueです。このディレクティブは、バインド直後に busy の値と一番下までスクロールしたかどうかをチェックすることを意味します。初期コンテンツの高さがスクロール可能なコンテナーを埋めるのに十分でない場合は、これをtrueに設定する必要があります。これにより、すぐにloadMoreが実行され、初期コンテンツを埋めるのに役立ちます。
  • infinite infinite-scroll-listen-for-event再度チェックされます。
  • infinite-scroll-throttle-delay特定の時間間隔でbusyの値をチェックします。デフォルト値は 200 です。これは、vue-infinite-scroll の基本原理が、vue-infinite-scroll がbusyの値と一番下までスクロールしたかどうかを周期的にチェックすることであるためです。コールバック関数は、busy が false で、スクロールが一番下まで到達した場合にのみ実行されます。

実用化

ご覧のとおり、上記の例ではデータ変数が常に変更されており、データ変数内のデータは絶えず増加しており、これは正しいようです。しかし、実際には、新しいデータは Ajax によって取得される必要があり、例のように for ループを使用して無駄な自然数を挿入する必要はありません。さらに、setTimeout は必要ありません。必要なのは、ページが下までスクロールしたときにすぐに Ajax を実行することです。実際、上記のコードの setTimeout は、遅延読み込み効果をシミュレートするためだけのもので、Ajax を 1 秒間遅延させる必要があると言っているわけではありません。

実際の戦闘では何をすべきでしょうか?

データを取得するには、このシミュレートされた Ajax コードを実際の Ajax コードに変更するだけです。

 タイムアウトを設定する(() => {
        (var i = 0, j = 10; i < j; i++) の場合 {
          this.data.push({name: this.count++ })
        }
        コンソールログ(このデータ)
        this.busy = false
      }, 1000)

さらに、 this.busy = falseもAjaxコールバックとして使用する必要があります。


vue-スクローラー

インストール

npm インストール vue-scroller -d

main.js での使用

'vue-scroller' から VueScroller をインポートします
Vue.use(VueScroller)

使用

注: 高めに設定するのがベスト

<スクロールスタイル="top: 100px;" :height='400' :on-refresh="refresh" :on-infinite="infinite" ref="myscroller">
     <div class="order-box" v-for="(item,index) in orderList" :key="index">
                
     </div>
 </スクロール>

データ

データ(){
           戻る {
                ステータス: 'すべて',
                順序リスト:[],
                ページ:0,
                全ページ:1,
            }
        },

下に引いて更新

更新(完了){
                タイムアウトを設定します(()=>{
                    終わり();
                },1500)
            },

さらに読み込むには上に引っ張ってください

  • 注: データがテンプレートに割り当てられる前に done が呼び出されると、ドロップダウン関数が常にトリガーされるため、成功したリクエストのコールバックでテンプレートが割り当てられた後に呼び出す必要があります。
  • ドロップダウン関数はバインディング属性によってスクロール タグにバインドされるため、作成時にリクエスト関数を 1 回呼び出す必要はありません。ページが初期化されると、ドロップダウン関数が自動的に 1 回呼び出され、最初のページのデータが取得されます。
// プルダウンして無限をトリガーする (完了) {
                if(this.page>=this.all_page){
                    タイムアウトを設定します(()=>{
                        this.$refs.myscroller.finishInfinite(true);
                    },1500)
                }それ以外{
                    
                    タイムアウトを設定します(()=>{
                        this.page++;
                        this.getorderList(完了)
                        
                    },500);
                }
            },
 
getorderList(完了){
                this.$http({
                    メソッド:'post',
                    url:'/seckill/server/orderList',
                    データ:{
                        jwt:this.jwt、
                        ステータス:このステータス、
                        ページ:このページ、
                        ページサイズ:5
                    }
                }).then(res=>{
                    (res.data.code == 0)の場合{
                        
                        
                        this.orderList.push.apply(this.orderList、res.data.data.list) を実行します。
                        this.$refs.myscroller.finishInfinite(true)
 
                        this.page = res.data.data.page
                        this.all_page = res.data.data.all_page
                        終わり();
                    }それ以外{
                       
                    }
                })
            },

知らせ

タブ バーの切り替えが必要な場合は、スクロール バーの状態をリセットする必要があります。finishInfinite(false) パラメータが false の場合、プルアップ関数が再度呼び出され、スクロール バーの現在の状態がリセットされます。

すべて(){
                this.status = 'すべて'
                このページ = 0
                this.all_page = 1
                this.$refs.myscroller.finishInfinite(false);
                this.orderList = []
            },

triggerPullToRefresh() はプルダウンの更新をトリガーします

プルツーリフレッシュを完了する

this.$refs.my_scroller.finishInfinite(false)
FinishInfinite(isNoMoreData :Boolean) パラメータが false の場合、プルアップデータ取得を再度呼び出すことができます。パラメータが true の場合、プルアップ データ コールバック関数は使用されず、プルダウンの下部に読み込み中と表示されなくなり、「これ以上データがありません」と表示されます。


vue 無限読み込み

インストール

npm インストール vue-infinite-loading --save

コンポーネント内での使用

// コンポーネントクラスは import InfiniteLoading from 'vue-infinite-loading' を使用します。
 
エクスポートデフォルト{
  コンポーネント: { InfiniteLoading }
}
 
//基本バージョンを使用する <infinite-loading
  スピナー="スパイラル"
  @infinite="無限ハンドラー"
  :距離="200"
  クラス="無限読み込みラップ"
>
  <!-- <div slot="spinner">読み込み中...</div> -->
  <div slot="no-more">データがありません</div>
  <div slot="no-results">結果データなし</div>
  <!-- <div slot="error" slot-scope="{トリガー}">
	エラーデータ。再試行するには、<a href="javascript:;" rel="external nofollow" rel="external nofollow" @click="trigger">ここ</a>をクリックしてください。
  </div> -->
</無限読み込み>

基本的な使い方

<テンプレート>
  <div> 
		    <p v-for="(item,index) リスト内" :key="index"> 
			     <span v-text="アイテム"></span> 
		    </p> 
		    <!-- 無限読み込みコンポーネントは、スクロール ボックス内のリストの下部に配置する必要があります。 -->
		<無限読み込み
			スピナー="スパイラル"
			@infinite="無限ハンドラー"
			:識別子="無限ID"
			:距離="200"
			クラス="無限読み込みラップ"
		>
			<div slot="spinner">読み込み中...</div>
			<div slot="no-more">データがありません</div>
			<div slot="no-results">結果データなし</div>
			<div slot="エラー" slot-scope="{トリガー}">
			  エラーデータ。再試行するには、<a href="javascript:;" rel="external nofollow" rel="external nofollow" @click="trigger">ここ</a>をクリックしてください。
			</div>
		</無限読み込み> 
	 </div>
</テンプレート>
 
<スクリプト> 
 'vue-infinite-loading' から InfiniteLoading をインポートします。
  エクスポートデフォルト{
    データ() {
      戻る {
		  infiniteId: +new Date(), // スクロール状態の変更をリセット page: 1,
        リスト: []
      };
    },
    メソッド: {
		// スクロール状態をリセットする rest(){
		  このリスト = [];
		  このページは 1 です。
		  this.infiniteId += 1;
		},
      非同期無限ハンドラ($state) {
			// リクエストデータをシミュレートします。const res = await this.$axios.workList({ page: this.page, pagesize: 20 });
			  (res.data.list.length) の場合 {
				このページ += 1;
				this.list = this.list.concat(res.data.list);
				$state.loaded();
			  } それ以外 {
				$state.complete();
			  }
        // ここでは1秒の読み込み遅延をシミュレートします //setTimeout(() => {
         // temp = [] とします。
         // (let i = this.list.length + 1; i <= this.list.length + 20; i++) {
          // temp.push(i);
         // }
         // this.list = this.list.concat(temp);
         // $state.loaded();
        //, 1000);
      //,
    },
    コンポーネント: { InfiniteLoading }
  }
</スクリプト>

ページングの使用

<テンプレート>
  <div>
    <ul>
      <li class="hacker-news-item" v-for="(item, key) in list"></li>
    </ul>
    <無限ロード @infinite="infiniteHandler">
      データはもうありません
    </無限読み込み>
  </div>
</テンプレート>    
 
<スクリプト>
「vue-infinite-loading」からInfiniteLoadingをインポートします。
「axios」からaxiosをインポートします。
エクスポートデフォルト{
  データ() {
    戻る {
      リスト: [],
    };
  },
  メソッド: {
    無限ハンドラ($state) {
      let api = "http://xxx.com/xxx"; // api は axios のデータ アドレスを要求します
        .get(api, {
          パラメータ: {
            // ページ番号パラメータ(ページあたり 10 個)
            ページ: this.list.length / 10 + 1、
          },
        })
        .then((応答) => {
          if (応答データの長さ) {
            // response.data はリクエスト インターフェイスによって返される配列リストです。this.list = this.list.concat(response.data);
            $state.loaded();
            (this.list.length / 10 === 10)の場合{
              // ここでは 10 ページのデータが読み込まれ、これ以上読み込まれないように設定されています $state.complete();
            }
          } それ以外 {
            $state.complete();
          }
        });
    },
  },
  コンポーネント: { InfiniteLoading },
};
</スクリプト>

説明: $state: このコンポーネントは、特別なイベント パラメータ $state をイベント ハンドラに渡して、読み込み状態を変更します。$state パラメータには、loaded メソッド、complete メソッド、reset メソッドの 3 つのメソッドが含まれます。

  • loaded メソッドは、各データのロード後にアニメーションを停止するために使用され、その後、コンポーネントは次のトリガーの準備が整います。
  • complete メソッドは無限読み込みを完了するために使用され、コンポーネントはスクロール操作を処理しなくなります。ロード時にメソッドが呼び出されない場合、このコンポーネントはユーザーに結果メッセージを表示します。そうでない場合は、それ以上のユーザーメッセージは表示されず、他のコンテンツはスロットによって設定できます。
  • リセットメソッドはコンポーネントを元の状態に戻します

条件付き使用

<テンプレート>
    <div class="ハッカーニュースリスト">
          <div class="ハッカーニュースヘッダー">
            <!-- プルダウンして変更 -->
            <v-model="タグ" @change="changeFilter()">を選択します。
                  <option value="story">ストーリー</option>
                  <option value="history">履歴</option>
            </選択>
              <!--またはクリックして変更-->
            <button @click="changeFilter()">検索</button>
          </div>
          <ul>
              <li class="hacker-news-item" v-for="(item, key) in list"></li>
           </ul>
           <!--ref="infiniteLoading" を設定することを忘れないでください -->
          <infinite-loading @infinite="infiniteHandler" ref="infiniteLoading">
            これ以上のデータはありません
          </無限読み込み>
    </div>
</テンプレート>
 
<スクリプト>
    'vue-infinite-loading' から InfiniteLoading をインポートします。
    'axios' から axios をインポートします。
 
    エクスポートデフォルト{
          データ() {
            戻る {
                  リスト: [],
                  タグ: 'ストーリー',
            };
          },
          メソッド: {
            無限ハンドラ($state) {
                  定数api="http://xxx.com/xxx";
                  //api はデータアドレスを要求します axios.get(api, {   
                    パラメータ: {
                        // 変更された条件パラメータタグ: this.tag,  
                          ページ: this.list.length / 10 + 1、
                    },
                  }).then(({ データ }) => {
                    if (データ結果の長さ) {
                          this.list = this.list.concat(data.result);
                          $state.loaded();
                          (this.list.length / 20 === 10)の場合{
                            状態.complete();
                          }
                    } それ以外 {
                          $state.complete();
                    }
                  });
            },
            //このメソッドを使用して条件バーを変更します changeFilter() {
                  このリスト = [];
                  this.$nextTick(() => {
                    this.$refs.infiniteLoading.$emit('$InfiniteLoading:reset');
                  });
            },
          },
          コンポーネント: { InfiniteLoading }
    }
</スクリプト>

安定

import { debounce } from "lodash"; // 手ぶれ防止 // 手ぶれ防止 get: debounce(async function () {
  k = this.$axios.getList_API() を待機します。
  console.log(k, "手ぶれ補正バージョン");
}, 1000),

これで、Vue がスクロールダウンしてさらにデータを読み込む - scroll - case に関するこの記事は終了です。Vue の読み込みデータに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueはプルダウンとスクロールでデータを読み込む例を実装しています
  • マウススクロールを使用してデータを読み込む Vue の例
  • Vue でページの一番下までスクロールしたときにデータを無限に読み込むサンプル コード
  • Vue.Js と Jquery Ajax を組み合わせてデータをロードする 2 つの方法の詳細な説明
  • Javascript vue.js テーブルページング、Ajax データの非同期読み込み
  • Vue.js テーブル ページング Ajax データの非同期読み込み

<<:  Windows での MySQL 8.0.18 インストール チュートリアル (図解)

>>:  Flask アプリケーションの Docker デプロイ実装手順

推薦する

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

Mysql はテーブル内の古いデータを定期的にクリアし、いくつかのデータを保持します (推奨)

以下の目標を達成するため: Mysql データベースは、一定の間隔 (2 時間または 1 日、カスタ...

CSS の ::before と ::after 疑似要素について知らないこと

CSS には、一般的には使用されない 2 つの疑似クラス、before と :after があります...

HTML Web ページにおける URL の表現

HTML では、一般的な URL はさまざまな方法で表現されます。相対 URL:コードをコピーコード...

Linuxダイナミックリンクライブラリの使用

通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装...

この記事ではCSSボーダーの使い方を説明します

境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...

MySQLはライブラリ内の主キーなしでテーブルインスタンスコードを素早く取得します

概要MySQL データベースで主キーのないテーブルを表示するための SQL ステートメントをいくつか...

Vue バインディング オブジェクト、配列データを動的にレンダリングできないケースの詳細な説明

プロジェクトシナリオ: Dark Horse Vueプロジェクト管理の実践、製品分類の取得、拡張バー...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

JavaScript の遅延読み込み属性パターンに関する簡単な説明

目次1. はじめに2. オンデマンド属性モード3. 乱雑な遅延読み込み属性パターン4. クラスの唯一...

js クロージャとガベージ コレクション メカニズムの例の詳細な説明

目次序文文章1. 終了1.1 クロージャとは何ですか? 1.2 クロージャの特性1.3 クロージャを...

Linux ネットワーク システムの紹介

目次ネットワーク情報ホスト名を変更するDNSドメイン名解決ネットワーク関連コマンドファイアウォール暗...

js QRコードスキャンログインの原理についての簡単な説明

目次QRコードログインの真髄QRコードを理解するシステム認証メカニズムQRコードをスキャンしてログイ...

Nodejs でタイムドクローラーを実装する完全な例

目次事件の原因Node Scheduleを使用してスケジュールされたタスクを実装する1. node-...

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

目次1. Dockerのセキュリティ問題2. Dockerアーキテクチャの欠陥とセキュリティメカニズ...