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 のマークアップ検証

推薦する

Vueプロジェクトのパッケージングと展開の実際のプロセスの記録

目次序文1. 準備 - サーバーとnginxの使用1. サーバーを準備する2. nginxをインスト...

セマンティック HTML タグの紹介

ここ数年、ウェブサイト開発では DIV+CSS が非常に人気があり、当時は大きな騒動を引き起こしまし...

レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策

最近、Bootstrap を使って Web サイトを開発しています。表を処理していたところ、PC で...

ウォーターフォールフローレイアウトを実装する3つの方法

序文今日、Xianyuを閲覧していたとき、各行の高さが同じではないことに気付きました。調べてみると、...

1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。

数日前、ある要件に取り組んでいたとき、MySQL で重複レコードをクリーンアップする必要がありました...

HTML Webページ作成チュートリアル iframeタグを慎重に使用してください

iframe を使用すると、他の Web サイトのページを簡単に呼び出すことができますが、注意して使...

Linuxルートの初期値を設定する方法の簡単な分析

Ubuntu ではデフォルトで root ログインが許可されていないため、初期の root アカウン...

HTML のタイトル、段落、改行、水平線、特殊文字についての簡単な説明

タイトルXML/HTML コードコンテンツをクリップボードにコピー< h1 >第 1 レ...

Ubuntu 19でdockerソースをインストールできない問題を共有する

主要な Web サイトと個人的な習慣に従って、Docker ソースを追加するには次の方法を使用します...

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

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

MySQLでスケジュールされたタスクを設定する方法の分析

この記事では、例を使用して、MySQL でスケジュールされたタスクを設定する方法について説明します。...

Linux (Ubuntu 18.04) に Anaconda をインストールする詳細な手順

Anaconda は、大規模なデータ処理、予測分析、科学計算のための最も人気のある Python デ...

MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?

私は最近新しい会社に入社したのですが、データベース設計にいくつか小さな問題があることに気付きました。...

WindowsはVMwareを使用してLinux仮想マシンを作成し、CentOS7.2オペレーティングシステムをインストールします。

目次1. ウィザードに従って仮想マシンを作成します2. オペレーティングシステムをインストールします...