欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue實(shí)現(xiàn)無限加載瀑布流

 更新時間:2021年11月04日 11:50:20   作者:immocha  
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)無限加載瀑布流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Vue實(shí)現(xiàn)無限加載瀑布流的具體代碼,供大家參考,具體內(nèi)容如下

我做的這個瀑布流放在了一個嵌套頁面里,就是類似管理后臺的main content中,如果要改成全屏的也很方便,其實(shí)更容易些,因?yàn)闀荛_一些在元素上使用onScroll的坑。

通過這個瀑布流,可以掌握以下幾個知識點(diǎn):

1、在元素上監(jiān)聽scroll事件,相對直接在window上監(jiān)聽麻煩一點(diǎn)點(diǎn);
2、image.onload事件;
3、promiseAll;
4、vue 的 transition-group

這里使用了mockjs來模擬圖片數(shù)據(jù),然后通過axios來調(diào)用圖片數(shù)據(jù),也可使用其他數(shù)據(jù)源。

通過計算圖片高度,判斷把圖片加載到哪一列。
如果屏幕還有空余,那就繼續(xù)加載。
無限滾動加載。
屏幕resize這塊沒有做,后期可以加上去。

直接貼代碼,有問題歡迎切磋。

<template>
  <div class="waterfall wf-wrap" ref="waterfall" @scroll="onScroll">
    <ul>
      <transition-group name="list" tag="li">
        <li
          v-for="(item,index) in waterfallList"
          :key="index"
          class="wf-item"
          :style="{top:item.top+ 'px',left:item.left+'px', width:item.width+'px', height:item.height + 'px'}"
        >
          <img :src="item.src" />
        </li>
      </transition-group>
    </ul>
  </div>
</template>
<script>
import { getList } from "@/api/demo";

export default {
  name: "Waterfall",
  data() {
    return {
      waterfallList: [],

      waterfallCol: 5,
      colWidth: 236,
      marginRight: 10,
      marginBottom: 10,
      colHeights: [],

      listQuery: {
        page: 1,
        limit: 5,
        sort: "+id"
      },
      loading: false,
      show: true
    };
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      // 初始化時,每欄高度都為0
      this.colHeights = new Array(this.waterfallCol);
      for (let 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();
    },

    loadImgs() {
      this.loading = true;
      // 從api獲取數(shù)據(jù)
      getList(this.listQuery).then(res => {
        let images = res.data.items;
        let promiseAll = [],
          imgs = [],
          total = images.length;

        for (let i = 0; i < total; i++) {
          promiseAll[i] = new Promise(resolve => {
            imgs[i] = new Image();
            imgs[i].src = images[i].image_uri;
            imgs[i].onload = () => {
              let imgData = {};
              imgData.height = (imgs[i].height * this.colWidth) / imgs[i].width;
              imgData.width = this.colWidth;
              imgData.src = images[i].image_uri;
              this.waterfallList.push(imgData);
              this.rankImgs(imgData);
              resolve(imgs[i]);
            };
          });
        }
        Promise.all(promiseAll).then(() => {
          this.loading = false;
          this.loadMore();
        });
      });
    },

    loadMore() {
      if (
        this.$refs.waterfall.clientHeight + this.$refs.waterfall.scrollTop >
          this.filterMin().minHeight &&
        this.loading == false
      ) {
        this.loading = true;
        setTimeout(() => {
          this.loadImgs();
        }, 200);
      }
    },

    rankImgs(imgData) {
      let min = this.filterMin();
      imgData.top = min.minHeight;
      imgData.left = min.minIndex * (this.colWidth + this.marginRight);

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

    filterMin() {
      let minHeight = Math.min.apply(null, this.colHeights);
      return {
        minHeight: minHeight,
        minIndex: this.colHeights.indexOf(minHeight)
      };
    },

    onScroll() {
      this.loadMore();
    }
  }
};
</script>

<style lang="scss" scoped>
ul li {
  list-style: none;
}

.wf-wrap {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: scroll;
}
.wf-item {
  position: absolute;
}
.wf-item img {
  width: 100%;
  height: 100%;
}
.list-enter-active,
.list-leave-active {
  transition: all 1s;
}
.list-enter, .list-leave-to
/* .list-leave-active for below version 2.1.8 */ {
  opacity: 0;
  transform: translateY(30px);
}
</style>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue對storejs獲取的數(shù)據(jù)進(jìn)行處理時遇到的幾種問題小結(jié)

    vue對storejs獲取的數(shù)據(jù)進(jìn)行處理時遇到的幾種問題小結(jié)

    這篇文章主要介紹了vue對storejs獲取的數(shù)據(jù)進(jìn)行處理時遇到的幾種問題小結(jié),需要的朋友可以參考下
    2018-03-03
  • vue2.x版詳解computed和watch的使用

    vue2.x版詳解computed和watch的使用

    這篇文章主要介紹了vue2.x版詳解computed和watch的使用,文章在基于vue框架的前端項(xiàng)目開發(fā)過程中,只要涉及到稍微復(fù)雜一點(diǎn)的業(yè)務(wù),我們都會用到computed計算屬性這個鉤子函數(shù),可以用于一些狀態(tài)的結(jié)合處理和緩存的操作
    2022-07-07
  • 代碼分析vue中如何配置less

    代碼分析vue中如何配置less

    在本篇文章中,我們給大家詳細(xì)講述了vue中如何配置less的詳細(xì)代碼和步驟,有需要的朋友跟著學(xué)習(xí)下。
    2018-09-09
  • vue實(shí)現(xiàn)簡單全選和反選功能

    vue實(shí)現(xiàn)簡單全選和反選功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡單全選和反選功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Vue 實(shí)用分頁paging實(shí)例代碼

    Vue 實(shí)用分頁paging實(shí)例代碼

    本篇文章主要介紹了Vue 實(shí)用分頁paging實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • vue如何動態(tài)修改$router參數(shù)

    vue如何動態(tài)修改$router參數(shù)

    這篇文章主要介紹了vue如何動態(tài)修改$router參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue圖片瀏覽組件v-viewer用法分析【支持旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作】

    Vue圖片瀏覽組件v-viewer用法分析【支持旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作】

    這篇文章主要介紹了Vue圖片瀏覽組件v-viewer用法,結(jié)合實(shí)例形式分析了v-viewer的基本功能與使用方法,包括旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作技巧,需要的朋友可以參考下
    2019-11-11
  • vue將html頁面生成高清晰pdf文件的方法

    vue將html頁面生成高清晰pdf文件的方法

    最近工作中遇到個需求,需要實(shí)現(xiàn)個可視化圖表頁的PDF文件導(dǎo)出,所以下面這篇文章主要給大家介紹了關(guān)于利用vue如何將html頁面生成高清晰pdf文件的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • vue點(diǎn)擊自增和求和的實(shí)例代碼

    vue點(diǎn)擊自增和求和的實(shí)例代碼

    今天小編就為大家分享一篇vue點(diǎn)擊自增和求和的實(shí)例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue實(shí)現(xiàn)鎖屏功能的示例代碼

    Vue實(shí)現(xiàn)鎖屏功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue實(shí)現(xiàn)簡單的鎖屏功能,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的小伙伴可以了解一下
    2023-06-06

最新評論