小程序 分页组件 工具类

这篇博客详细介绍了如何利用Paging类来处理分页加载数据的逻辑,包括防止重复请求、判断是否还有更多数据等功能。示例中,Paging类通过Http请求获取数据,并提供了getMoreData方法用于加载下一页。同时,博客还涉及到前端分页可能出现的问题及解决方案,如数据为空、加载状态等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import {Http} from "./http";

class Paging{
    //不关心细节
    //我需要下一页的数据 你能给我吗
    start
    count
    req
    locker=false
    url
    moreData = true
    accumulator = []

    constructor(req,count=10,start=0){
        this.start = start;
        this.count = count;
        this.req = req;
        this.url = req.url
    }
    //分页可能遇到的问题
    //1/一条数据没有空
    //2 最后一页 还没有更多的数据
    //3 累加 100 1-20 21-40 setData重新渲染yemian
    //4非分页数据  正在加载 loading
    //分页数据 正在加载 加载完成 没有更多数据
    //上划页面触底架子啊避免用户重复发送请求
    async getMoreData() {
        if (!this.moreData){
            return
        }
        //发请求
        if (!this._getLocker()) {
            return
        }
        const data = await this._actualGetData()
        this._releaseLocker()
        return  data
    }

    async _actualGetData(){
        const req = this._getCurrentReq()
        let paging =  await Http.request(req)
        if (!paging){
            return null
        }
        //如果为空
        if (paging.total === 0) {
            return {
                empty: true,
                items: [],
                //没有数据
                moreData: false,
                //累加器
                accumulator: []
            }
        }
        this.moreData = Paging._moreData(paging.total_page,paging.page)
        if(this.moreData){
            this.start += this.count
        }
        this._accumulate(paging.items)
        return {
            empty:false,
            items: paging.items,
            moreData:this.moreData,
            accumulator:this.accumulator
        }
    }

    _accumulate(items){
        this.accumulator = this.accumulator.concat(items)
    }

    //判断是不是最后一页
    static _moreData(totalPage,pageNum){
        return pageNum < totalPage-1
    }

    _getCurrentReq(){
        let url = this.url
        const params = `start=${this.start}&count=${this.count}`
        if (url.indexOf('?') !== -1){
            url +='&' + params
        }
        else{
            url +='?' + params
        }
        this.req.url = url
        return this.req
    }

    _getLocker(){
        if (this.locker){
            return false;
        }
        this.locker = true
        return true
    }
    _releaseLocker(){
        this.locker = false
    }
}
export {
    Paging
}

 

import {config} from "../pages/config/config";
import {promisic} from "./utils";

class Http{

    static async request({url,data,method='GET'}){
     const res = await  promisic(wx.request)({
          url:`${config.apiBaseUrl}${url}`,
          data:data,
          method: method,
          header:{
              appkey:config.appkey
          }
        })
        return res.data;
    }

}

export{
    Http
}

  async initBottomSpuList(){
    const paging =  SpuPaging.getLatestPaging()
    const data = await paging.getMoreData()
    if (!data){
      return
    }
    wx.lin.renderWaterFlow(data.items)
  },

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值