首页 > 技术文章 > element的无限滚动配合接口请求数据

bigbang66 2022-05-09 14:37 原文

无限滚动效果

<template>
  <div class="route-wrapper">
    <ul
      v-infinite-scroll="infiniteScroll"
      // 在要实现滚动加载的列表上上添加v-infinite-scroll,并赋值相应的加载方法,可实现滚动到底部时自动执行加载方法。
      :infinite-scroll-disabled="routeLoad || noMore" // 是否禁用(数据到最后时,禁止滚动加载)
      :infinite-scroll-distance="5" // 触发加载的距离阈值,单位为px
      class="all-route">
      <li
        v-for="(item, index) in routeData"
        :key="index"
        class="route-item">
        ...
      </li>
    </ul>
  </div>
</template>
<script>
import { getAirlineList } from '@/api/route';

export default {
  name: 'AllRoute',
  data() {
    return {
      routeData: [],
      noMore: false, // 控制滚动禁用
      routeLoad: false, // 控制滚动禁用
      pageNo: 0, // 页码
      pageSize: 6 // 一页6条
    };
  },
  methods: {
    // 滚动加载方法
    infiniteScroll() {
      this.routeLoad = true;
      this.pageNo += 1; // 页码每次滚动+1
      this.getRouteList();
    },
    // 获取数据
    getRouteList() {
      let para = {
        pageNo: this.pageNo,
        pageSize: this.pageSize
      };
      getAirlineList(para)
        .then(res => {
        // 把每一次滚动加载请求的数据push的routeData数组
          let list = res.data.records;
          for (let i = 0; i < list.length; i++) {
            this.routeData.push(list[i]);
          }
          // 如果请求回来的数据小于pageSize,则说明数据到底了。
          if (list.length < 6) {
            this.noMore = true;
          }
          // 避免数据总条数是pageSize的倍数时,数据到底还会请求一次。
          if (this.routeData.length === res.data.total) {
            this.noMore = true;
          }
          this.routeLoad = false;
        })
        .catch(res => {});
    }
  }
};
</script>
<style lang="scss" scoped>
.route-wrapper {
  .all-route {
    height: 300px;
    overflow-y: auto;
  }
}
</style>

 

推荐阅读