移动端下拉加载更多(h5,小程序)

1.h5,使用原生方式监听页面滚动下拉加载更多

复制代码
<template>
  <div></div>
</template>

<script>
export default {
  data() {
    return {
      loadflag: true,
      maxpages: 0, //最大页码
      currentpage: 0, //当前页
      listData: [],
      config: {
        page: 1,
        pageSize: 15,
        total: 0,
        pages: 0,
      },
    }
  },
  created() {
    this.getList()
    window.addEventListener('scroll', this.handleScroll, true)
  },
  methods: {
    handleScroll() {
      const _this = this
      let scrollTop =
        document.documentElement.scrollTop || document.body.scrollTop
      //变量windowHeight是可视区的高度
      let windowHeight =
        document.documentElement.clientHeight || document.body.clientHeight
      //变量scrollHeight是滚动条的总高度
      let scrollHeight =
        document.documentElement.scrollHeight || document.body.scrollHeight
      //滚动条到底部的条件
      let data = scrollTop + windowHeight
      if (
        data == scrollHeight ||
        (scrollHeight - data <= 60 && _this.loadflag)
      ) {
        let currentpage = _this.currentpage
        let maxpages = _this.maxpages
        if (maxpages > currentpage && _this.loadflag) {
          _this.loadflag = false
          _this.config.page++
          _this.getList()
        }
      }
    },
    async getList() {
      let params = {
        page: this.config.page,
        pageSize: this.config.pageSize,
      }
      const res = await apiGet(posterGetBrochureList, params)
      this.isShowList = true

      if (res.code == 200) {
        const { total, records, current, pages } = res.data
        this.config.page = current //当前页
        this.config.pages = pages //总共多少页
        this.config.total = total //总条数
        this.maxpages = pages
        this.currentpage = current
        if (current <= pages) {
          this.loadflag = true
          this.listData = [...this.listData, ...records]
        } else {
          this.listData = records
        }
      }
    },
  },
  destroyed() {
    //离开页面的时候移除监听滚动事件,提高性能
    window.removeEventListener('scroll', this.handleScroll, true)
  },
}
</script>

<style lang="scss" scoped></style>

2.使用组件vant(van-list)

复制代码
<template>
  <div></div>
</template>

<script>
export default {
  data() {
    return {
      listLoading: false, //分页加载
      finished: false, //分页是否加载完成
      listData: [],
      config: {
        page: 1,
        pageSize: 10,
        total: 0,
      },
    }
  },
  created() {
    this.getList()
  },
  methods: {
    //关键函数,监听下拉加载更多
    onLoad() {
      this.getList()
    },
    async getList() {
      const formData = {
        page: this.config.page,
        pageSize: this.config.pageSize,
      }
      const res = await apiGet(apigetqueryArchiveMatchedPageList, formData)
      if (res.code == 200) {
        const data = res.data
        this.listData = [...this.listData, ...data.records]
        this.listLoading = false
        //判断如果当前请求条数小于十条,就停止下拉加载
        if (data.records.length < 10) {
          this.finished = true
        }
        this.config.page++
      }
    },
  },
}
</script>

<style lang="scss" scoped></style>

3.uniapp使用scroll-view下拉加载更多

复制代码
 <scroll-view
        class="law_main"
        scroll-y="true"
        @scrolltolower="lower"
        lower-threshold="50"
        refresher-enabled
        :refresher-triggered="triggered"
        @refresherrefresh="onRefresh"
      >
 <view v-for="(item, index) in dataList" :key="index" class="content">
  <view class="time">
    {{ item.createTime }}
  </view>
  <view class="score">
   {{ item.integral }}
    </view>
   </view>
   <!-- <view class="more_text" v-if="showMoreData">没有数据了...</view> -->
   </scroll-view>

<script>
import { exam } from '@/api/index.js'
export default {
  data() {
    return {
      dataList: [],
      pageNum: 1,
      pageSize: 20,
      totalPage: 1,
      triggered: false,
      isfreshing: false,
      showMoreData: false,
      title: '暂无数据',
    }
  },
  onShow() {
    this.getData()
  },
  methods: {
    lower(e) {
      if (this.pageNum < this.totalPage) {
        this.pageNum += 1
        this.getData()
      }
    },
    onRefresh() {
      if (!this.triggered) {
        if (this.isfreshing) return
        this.isfreshing = true
        if (!this.triggered) {
          this.triggered = true
        }
        this.showMoreData = false
        this.emptyData = false
        this.dataList = []
        this.pageNum = 1
        this.getData()
      }
    },
    getData() {
      let params = {
        current: this.pageNum,
        size: this.pageSize,
      }
      uni.showLoading({
        title: '正在加载',
      })
      try {
        exam.answerPaperUserPaperList(params).then((res) => {
          if (this.pageNum == 1) {
            this.dataList = res.data.records
            this.triggered = false
            this.isfreshing = false
          } else {
            this.dataList = this.dataList.concat(res.data.records)
          }
          // if (this.dataList.length == res.data.total && this.dataList.length > 20) {
          // 	this.showMoreData = true;
          // }
          res.data.total == this.pageSize
            ? (this.totalPage = 1)
            : (this.totalPage = parseInt(res.data.total / this.pageSize + 1))
          if (!this.dataList.length) {
            this.emptyData = true
            this.showMoreData = false
          }
          uni.hideLoading()
        })
      } catch (error) {
        uni.hideLoading()
      }
    },
  },
  onUnload() {},
}
</script>

tips:使用scroll-view下拉加载更多时,需要给一个高度,否则下拉加载将不生效

4.uniapp监听页面触底加载更多onReachBottom

复制代码
<script>
import { articlePageListApi } from '@/service/newpage.js'
import qs from 'qs'
export default {
  data() {
    return {
      params: {
        page: 1,
        pageSize: 10,
      },
      status: 'loadmore',// loadmore/loading / nomore
      artlist: [],
      hasmore: true,
    }
  },
  onLoad() {
    this.params.page = 1
    this.artlist = []
    this.hasmore = true
    this.getMylist()
  },
  //关键代码下拉刷新加载更多
  onReachBottom() {
    this.status = 'loading'
    if (this.hasmore) {
      this.status = 'loading'
      this.params.page++
      this.getMylist()
    } else {
      let timmer = setTimeout(() => {
        this.status = 'nomore'
      }, 1000)
    }
  },
  methods: {
    getMylist() {
      articlePageListApi(
        qs.stringify({
          ...this.params,
        }),
      ).then((res) => {
        if (res.data) {
          const { list } = res.data
          if (this.artlist?.length < list.total) {
            this.hasmore = true
            this.status = 'loadmore'
          } else {
            this.hasmore = false
            this.status = 'nomore'
          }
          this.artlist = [...this.artlist, ...list.records]
        }
      })
    },
  },
}
</script>
相关推荐
To_OC1 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic2 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy2 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志2 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble3 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯4 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜5 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司5 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
江华森6 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http
IT_陈寒6 小时前
Redis的KEYS命令把我搞崩溃了,改用SCAN才活过来
前端·人工智能·后端