web端实现列表滚动加载更多数据

项目要求实现列表滚动加载多数据,element的InfiniteScroll 无限滚动不是很好用,于是就自己写了一个,首先要设置滚动的区域高度height: calc(100% - 45px)和overflow: auto;

具体高度可根据需要自己设置

具体实现方法如下

<template>
<div class="nav-list-main">
      <div
        class="nav-li"
        :class="{ active: index === curIndex }"
        v-for="(item, index) in navList"
        :key="item.appid"
        @click="changeApp(item, index)"
      >
        <el-image class="avatar-img" :src="previewImage(item.appIcon)"></el-image>
        <div class="app-info">
          <div class="app-name">{{ item.appName }}</div>
          <div class="device">{{ item.platform }}</div>
        </div>
      </div>
    </div>
</template>
<script>
export default {
    data() {
        return {
            params: {
                appName: '',
                page: 0,
                pageSize: 10,
                total: 0
            },
            tableData: [],
            isReachBottom: false,
            reachBottomDistance: 100,
            scrollHeight: 0,
            offsetHeight: 0
        }
    },
    created() {
        this.getData();
    },
    mounted() {
    
        let dom = document.querySelector('.content-nav .nav-list-main');
        this.scrollHeight = dom.scrollHeight;
        this.offsetHeight = Math.ceil(dom.getBoundingClientRect().height);

        window.addEventListener('scroll', this.onScroll, true);
    },
    destroyed() {
        window.removeEventListener('scroll', this.onScroll);
    },
    methods: {
        onScroll(e) {
          let scrollTop = e.target.scrollTop;
          let currentHeight = scrollTop + this.offsetHeight + this.reachBottomDistance;

          if (currentHeight < this.scrollHeight && this.isReachBottom) {
            this.isReachBottom = false;
          }
          if (this.isReachBottom) {
            return;
          }
          if (currentHeight >= this.scrollHeight) {
            this.isReachBottom = true;
            console.log('触底');
            this.params.page += 1;

            this.getData();
          }
        },
        async getData() {
          const params = _.cloneDeep(this.params);
          const res = await this.$api.usageShopManage.getAppList(params);
          const { content, totalElements } = res;
          this.params.total = totalElements;
          if (content.length > 0) {
            if (this.params.page === 0) {
              this.tableData = content;
            } else {
              this.tableData = this.tableData.concat(content);
            }
          } else {
            console.log('没有数据了');
          }
        },
    }
}
</script>

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值