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の匿名マウントと名前付きマウントの具体的な使用法

目次データ量匿名マウントと名前付きマウントデータボリュームの場所データ量匿名マウントと名前付きマウン...

Linuxでサーバーのハードウェア情報を表示する方法

みなさんこんにちは。今日は12連休ですが、何かお買い物はしましたか?今日は「Linux View S...

反応ルーティングでパラメータを渡すいくつかの方法についての簡単な説明

最初のパラメータ渡し方法は、動的ルーティングパラメータ渡しです。リンクのパス属性を設定することで、ル...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

Linux カーネル デバイス ドライバー仮想ファイル システムに関する注意事項

/******************** * 仮想ファイルシステム VFS **********...

Vueカスタムディレクティブを使用してドラッグアンドドロッププラグインを構築する方法

HTML5 のドラッグ アンド ドロップ機能は誰もが知っていますが、これを使用するとドラッグ アンド...

Axios を使用して Vue2 がリクエストを開始する詳細なプロセス記録

目次序文Axiosのインストールと設定シンプルなGETリクエストを開始するPOSTリクエストを行うシ...

elementui での el-cascader カスケードセレクタの実践

目次1. 効果2. メインコード1. 効果機能: インターフェイスから取得したデータを使用してオプシ...

MySQL の基本ステートメントを最適化するための 10 の原則の概要

序文データベースの応用において、プログラマーは継続的な実践を通じて多くの経験を積んできました。これら...

CSS レスポンシブ レイアウト システムの例コード

レスポンシブ レイアウト システムは、今日の一般的な CSS フレームワークではすでに非常に一般的で...

Ubuntu 20.04 では、隠し録音ノイズ低減機能が有効になります (推奨)

最近、 Ubuntu 20.04でkazamを使用して録音しているときに、問題が見つかりました。シス...

Zabbix が MySQL のマスター/スレーブ状態を監視する方法の詳細な説明

MySQLマスタースレーブを設定した後、スレーブの状態が正常かどうかわからないことが多く、例外が発生...

QTとJavaScript間のインタラクティブデータの実装

1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...

Vueはシンプルなショッピングカートの例を実装します

この記事では、参考までに、Vue の具体的なコードを共有して、簡単なショッピングカートを実装します。...

Mysqlは日付範囲の抽出方法を指定します

データベースを操作する過程では、いくつかの指標を日付別にまとめたり、一定期間内の合計金額をカウントし...