小程序页面的上拉加载和下拉加载

1、需求:小程序的首页需要添加上拉加载和下拉加载的功能,之前做上拉加载和下拉加载是用的是scroll-view组件,但是感觉首页用scroll-view不是最佳选择,page自带的上拉加载和下拉加载更好用一点,就记录一下

2、解决:

上拉加载:

思路:上拉加载的原理是小程序在页面顶部撑出一块50px的空间,在一定时间后消失,所以在顶部的空间加上样式配置监听方法就好了

首先在首页json里面设置enablePullDownRefresh(还有个onReachBottomDistance属性可以设置拖动时加载区域的高度,默认50)

{
...
  "enablePullDownRefresh": true,
...
}

在js里面配置onPullDownRefresh方法监听用户下拉动作

复制代码
// pages/home/home.ts
export { }
const app = getApp<IAppOption>()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    hotGoodsForm: {
      pageNum: 1,
      pageSize: 10
    },
    hotGoodsList: [] as any,
    homeLoadStatus: 0
  },
  getHotGoodsInit(): void {
    this.data.hotGoodsForm.pageNum = 1
    this.data.hotGoodsForm.pageSize = 10
    app.ajax.post('/api/goods/getHotGoods', this.data.hotGoodsForm).then((res: any) => {
    //加载完成停止当前页面下拉刷新
      wx.stopPullDownRefresh()
      this.setData({
        hotGoodsList: res.list,
        homeLoadStatus: 0
      })
    })
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    this.getHotGoodsInit()
  },
})
复制代码

至于wxml的话,我是直接弄一个loading样式,定位在页面之前,这样下拉的时候直接显示加载中

<view class="home_swiper_loading">
  <t-loading theme="spinner" size="40rpx" loading text="加载中..."></t-loading>
</view>
复制代码
  .home_swiper_loading {
    width: 100%;
    height: 100rpx;
    position: absolute;
    display: flex;
    justify-content: center;
    align-items: center;
    top: -100rpx;
    background-color: #f5f5f5;
  }
复制代码

下拉加载:

思路:下拉加载是滚动到页面底部会触发监听事件,所以让list把page撑开,配置加载样式组件展示状态配置方法就ok了

下拉加载第一步就是要滚动到底部,如果你用的是自定义tabber,可以设置page属性来展示完全页面

page{
  height: auto;
  padding-bottom: calc(env(safe-area-inset-bottom) + 96rpx);
}

然后在最底部加一个展示状态的组件,用于展示加载中,没有更多数据和加载失败这些状态

<load-more list-is-empty="{{!hotGoodsList.length}}" status="{{homeLoadStatus}}" bind:retry="getHotGoodsInit" />

在js里面配置onReachBottom监听页面上拉触底事件,监听到事件后,处理新的数据

复制代码
// pages/home/home.ts
export { }
const app = getApp<IAppOption>()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    hotGoodsForm: {
      pageNum: 1,
      pageSize: 10
    },
    hotGoodsList: [] as any,
    homeLoadStatus: 0
  },
  getHotGoodsInit(): void {
    this.data.hotGoodsForm.pageNum = 1
    this.data.hotGoodsForm.pageSize = 10
    app.ajax.post('/api/goods/getHotGoods', this.data.hotGoodsForm).then((res: any) => {
      wx.stopPullDownRefresh()
      this.setData({
        hotGoodsList: res.list,
        homeLoadStatus: 0
      })
    })
  },
  getHotGoodsDowm(): void {
    this.setData({
      "hotGoodsForm.pageNum": this.data.hotGoodsForm.pageNum + 1,
      homeLoadStatus: 1
    })
    app.ajax.post('/api/goods/getHotGoods', this.data.hotGoodsForm).then((res: any) => {
      if (res.list.length != 0) {
        this.setData({
          hotGoodsList: [...this.data.hotGoodsList, ...res.list],
          homeLoadStatus: 0
        })
      } else {
        this.setData({
          homeLoadStatus: 2
        })
      }
    }).catch(() => {
      this.setData({
        homeLoadStatus: 3
      })
    })
  },
/** * 生命周期函数--监听页面加载 */ onLoad() { this.getBannerList() this.getHotGoodsInit() }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { this.getHotGoodsInit() }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { this.getHotGoodsDowm() }, })
复制代码

3、效果:

 

posted @   Pavetr  阅读(2034)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示