Vue は無限ロードウォーターフォールフローを実装します

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを紹介します。具体的な内容は次のとおりです。

私が作成したウォーターフォールフローは、管理背景のメインコンテンツに似たネストされたページに配置されています。フルスクリーンに変更したい場合にも非常に便利です。実際、要素でonScrollを使用する際の落とし穴を回避できるため、より簡単です。

このウォーターフォールフローを通じて、次の知識ポイントを習得できます。

1. 要素のスクロール イベントをリッスンするのは、ウィンドウで直接リッスンするよりも少し面倒です。
2. image.onload イベント;
3.promiseAll;
4. Vueのトランジショングループ

ここでは、mockjs を使用して画像データをシミュレートし、その後、axios を通じて画像データを呼び出します。他のデータ ソースも使用できます。

画像の高さを計算して、画像を読み込む列を決定します。
画面にまだ余裕がある場合は、読み込みを続行します。
無限スクロール読み込み。
画面のサイズ変更は行われていませんが、後で追加できます。

コードを直接貼り付けてください。質問がある場合は、お気軽にご相談ください。

<テンプレート>
  <div class="waterfall wf-wrap" ref="waterfall" @scroll="onScroll">
    <ul>
      <トランジショングループ名="リスト" タグ="li">
        <li
          v-for="waterfallList 内の (item,index)"
          :key="インデックス"
          クラス="wf-item"
          :style="{top:item.top+ 'px',left:item.left+'px', width:item.width+'px', height:item.height + 'px'}"
        >
          <img :src="item.src" />
        </li>
      </トランジショングループ>
    </ul>
  </div>
</テンプレート>
<スクリプト>
"@/api/demo" から { getList } をインポートします。

エクスポートデフォルト{
  名前:「滝」
  データ() {
    戻る {
      滝リスト: [],

      滝Col: 5,
      列幅: 236,
      マージン右: 10,
      マージン下: 10,
      高さ: [],

      リストクエリ: {
        ページ: 1,
        制限: 5,
        並べ替え: "+id"
      },
      読み込み中: false、
      表示: 真
    };
  },
  マウント() {
    これを初期化します。
  },
  メソッド: {
    初期化() {
      // 初期化されると、各列の高さは 0 になります
      this.colHeights = 新しい配列(this.waterfallCol);
      (i = 0 とします; i < this.colHeights.length; i++) {
        this.colHeights[i] = 0;
      }
      this.colWidth =
        (this.$refs.waterfall.clientWidth -
          (this.waterfallCol - 1) * this.marginRight) /
        this.waterfallCol;
      this.loadImgs();
    },

    画像を読み込む() {
      this.loading = true;
      // API からデータを取得する getList(this.listQuery).then(res => {
        画像を res.data.items とします。
        promiseAll = [] とします。
          画像 = [],
          合計 = 画像の長さ;

        (i = 0 とします; i < 合計; i++) {
          promiseAll[i] = 新しいPromise(resolve => {
            imgs[i] = 新しい画像();
            画像URIをコピーする
            imgs[i].onload = () => {
              imgData = {} とします。
              imgData.height = (imgs[i].height * this.colWidth) / imgs[i].width;
              imgData.width = this.colWidth;
              画像URIをコピーします。
              this.waterfallList.push(画像データ);
              this.rankImgs(画像データ);
              imgs[i]を解決します。
            };
          });
        }
        Promise.all(promiseAll).then(() => {
          this.loading = false;
          これをさらに読み込む();
        });
      });
    },

    ロードモア() {
      もし (
        this.$refs.waterfall.clientHeight + this.$refs.waterfall.scrollTop >
          this.filterMin().minHeight &&
        this.loading == false
      ){
        this.loading = true;
        タイムアウトを設定する(() => {
          this.loadImgs();
        }, 200);
      }
    },

    ランク画像(画像データ) {
      min = this.filterMin() とします。
      imgData.top = min.minHeight;
      imgData.left = min.minIndex * (this.colWidth + this.marginRight);

      this.colHeights[min.minIndex] += imgData.height + this.marginBottom;
    },

    フィルター最小値() {
      minHeight = Math.min.apply(null, this.colHeights); とします。
      戻る {
        最小高さ: 最小高さ、
        最小インデックス: this.colHeights.indexOf(minHeight)
      };
    },

    スクロール() {
      これをさらに読み込む();
    }
  }
};
</スクリプト>

<style lang="scss" スコープ>
ul li {
  リストスタイル: なし;
}

.wf-wrap {
  位置: 相対的;
  幅: 100%;
  高さ: 100%;
  オーバーフロー: スクロール;
}
.wf-item {
  位置: 絶対;
}
.wf-item画像{
  幅: 100%;
  高さ: 100%;
}
.list-enter-active、
.list-leave-active {
  遷移: すべて 1;
}
.list-enter、.list-leave-to
/* バージョン 2.1.8 未満では .list-leave-active */ {
  不透明度: 0;
  変換: translateY(30px);
}
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueは、さらに読み込むためにスライドするウォーターフォールフローコンポーネントを実装します
  • Vueウォーターフォールフローコンポーネントはプルアップ読み込みをさらに実現します
  • Vueはシンプルなウォーターフォールフローレイアウトを実装します
  • Vue はネットワーク画像のウォーターフォール フローを実装します + プルダウンして更新 + プルアップしてさらに読み込む (詳細な手順)
  • Vue でウォーターフォール プラグインのコード例を書く
  • Vue ウォーターフォールプラグインの使用例
  • vue.js コンポーネント vue-waterfall-easy はウォーターフォールフロー効果を実現します

<<:  MySQL UPDATE ステートメントの非標準実装コード

>>:  doctype のマークアップ検証

推薦する

Dockerはローカルディレクトリとデータボリュームコンテナ操作をマウントします

1. DockerはローカルディレクトリをマウントしますDocker は、ホスト上のディレクトリをイ...

Linuxはiptablesを使用して複数のIPからのサーバーへのアクセスを制限します

序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...

テキストエリアのテキストをHTMLに変換する方法、つまり復帰改行について

説明: テキストエリアの値の改行を新しい行に変更しますコードをコピーコードは次のとおりです。 <...

均一なアニメーション効果を実現するJavaScript

この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...

5つのクールで実用的なHTMLタグと属性の紹介

実はこれもクリックベイトのタイトルであり、「派手」とは言えません。ただ私が無知で、こうしたラベルを見...

MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明

同僚から、MySQL データ型 DECIMAL(N,M) の N と M の意味を尋ねられました。言...

MySQLの連結関数CONCATの使い方の詳しい説明

前回の記事では、MySQL の置換関数 (Replace) とセグメンテーション関数 (SubStr...

MySQLのネストされたトランザクションで発生する問題

MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....

Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

目次前面に書かれた要件分析 v1アイデア1: インターセプションメソッドを使用して入力ボックスの入力...

React NativeのScrollViewプルダウンリフレッシュ効果

この記事では、React Native ScrollViewのプルダウンリフレッシュ効果の具体的なコ...

Linux で NFS ファイル共有サーバーを構築するための詳細な手順

Linux が NFS サーバーを構築異なるオペレーティング システム間でデータを共有するために、通...

Vue 名前付きスロットの基本的な使用例

序文名前付きスロットは、スロット内の「name」属性を使用して要素にバインドされます。知らせ: 1....

MySQL マルチインスタンス構成のアプリケーションシナリオ

目次MySQL 複数インスタンスマルチインスタンスの概要マルチインスタンスとは何ですか?複数のインス...

css n番目から始まるすべての要素を取得する

具体的なコードは次のとおりです。 <div id="ボックス"> &...

mysql: [エラー] 不明なオプション '--skip-grant-tables'

MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...