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 デプロイ実装手順

推薦する

知っておくべき 25 の Vue のヒント

目次1. プロパティを型リストに制限する2. デフォルトのコンテンツと拡張ポイント3. ネストされた...

Vueはログインタイプの切り替えを実装します

この記事では、ログインタイプの切り替えを実装するためのVueの具体的なコードを例として紹介します。具...

MySQL トリガーの使用シナリオとメソッドの例

トリガー:トリガーの使用シナリオと対応するバージョン:トリガーは次の MySQL バージョンで使用で...

MySQL InnoDB ロックの概要

目次1. 共有ロックと排他ロック2. 意図ロック3. レコードロック4. ギャップロック5. ネクス...

W3C チュートリアル (3): W3C HTML アクティビティ

HTML は、World Wide Web 上で公開するために使用されるハイブリッド言語です。 XH...

Vue カプセル化コンポーネント アップロード画像コンポーネント

この記事の例では、参考のためにvueアップロード画像コンポーネントの具体的なコードを共有しています。...

MySQL 5.7.17 圧縮バージョンのインストールノート

この記事では、参考までにMySQL 5.7.17圧縮版のインストール手順を紹介します。具体的な内容は...

JavaScript 基礎シリーズ: 関数とメソッド

目次1. 関数とメソッドの違い2. 良い関数の書き方2.1 正確な命名2.1.1 関数の命名2.1....

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

jQuery でダイナミックなパーティクル効果を実現

この記事では、動的なパーティクル効果を実現するためのjQueryの具体的なコードを参考までに紹介しま...

Linux での stat 関数と stat コマンドの使用法の詳細な説明

stat 関数と stat コマンドLinux ファイル内の [inode = インデックス ノード...

使用場所によって混乱しやすいXHTMLタグ

<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...

オンライン MYSQL 同期エラーのトラブルシューティング方法の概要 (必読)

序文フェイルオーバーが発生した後、よくある問題は同期エラーです。データベースが小さい場合は、ダンプし...

30 種類の無料の高品質英語リボンフォント

30 種類の高品質な英語リボン フォントを無料でダウンロードできます。デザイナーは常に、25 種類の...

VMware 12 での Ubuntu 16.04 インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...