微信小程序 实现上拉加载更多功能:从基础到优化

实现上拉加载更多功能:从基础到优化

在移动互联网时代,上拉加载更多功能已成为用户浏览内容时的常见需求。本文将详细介绍如何在小程序中实现这一功能,并进行相关优化。

实现上拉加载

当用户从下向上滑动屏幕时,需要加载更多的商品数据。实现这一功能的关键在于监听用户的上拉行为,并在触发时发送请求获取下一页的数据。

实现步骤:

  1. 声明onReachBottom事件处理函数 :

    在.js文件中,声明onReachBottom方法,用于监听用户的上拉行为。

  2. 页码递增并发送请求 :

    在onReachBottom方法中,对页码page进行加1操作,并发送请求获取下一页的数据。

  3. 合并数据 :

    在getGoodsList函数中,将返回的数据与原有的数据进行合并,并更新到页面的数据中。

javascript 复制代码
import { reqGoodsList } from '../../../api/goods';

Page({
  data: {
    goodsList: [], // 商品列表数据
    total: 0, // 列表总数据量
    requestData: {
      page: 1, // 页码
      limit: 10, // 每页请求多少条数据
      category1Id: '', // 一级分类 id
      category2Id: '' // 二级分类 id
    }
  },
  
  // 获取商品列表的数据
  async getGoodsList() {
    const { data } = await reqGoodsList(this.data.requestData);
    this.setData({
      goodsList: [...this.data.goodsList, ...data.records],
      total: data.total
    });
  },

  // 监听页面的上拉操作
  onReachBottom() {
    let { page } = this.data.requestData;
    this.setData({
      requestData: { ...this.data.requestData, page: page + 1 }
    });
    this.getGoodsList();
  }
});
判断加载是否完毕

为了避免用户在上拉加载完毕后仍进行无效操作,我们需要判断数据是否已经加载完,并在加载完毕后给出提示。

实现步骤:

  1. 对比total和goodsList的长度 :

    在onReachBottom方法中,对比后端返回的total和当前goodsList的长度,如果相等则说明数据已加载完。

  2. 更新页面状态 :

    如果数据已加载完,则更新页面的状态,并给出提示。

javascript 复制代码
Page({
  // ...其他代码

  onReachBottom() {
    const { total, goodsList, requestData } = this.data;
    let { page } = requestData;

    if (total === goodsList.length) {
      this.setData({ isFinish: true });
      return;
    }

    this.setData({
      requestData: { ...this.data.requestData, page: page + 1 }
    });
    this.getGoodsList();
  }
});
节流阀进行列表节流

为了避免在网络较慢的情况下,用户频繁滑动导致的请求浪费,我们需要为上拉加载添加节流功能。

实现步骤:

  1. 定义节流阀状态isLoading :

    在页面的初始数据中,定义isLoading状态,用于判断当前是否有请求正在发送。

  2. 在请求前后更新isLoading状态 :

    在getGoodsList函数中,发送请求前将isLoading设置为true,请求结束后设置为false。

  3. 在onReachBottom中判断isLoading状态 :

    如果isLoading为true,则不进行下一页数据的加载。

javascript 复制代码
Page({
  data: {
    // ...其他数据
    isLoading: false, // 判断数据是否正在加载
  },

  // 获取商品列表的数据
  async getGoodsList() {
    this.setData({ isLoading: true });
    const { data } = await reqGoodsList(this.data.requestData);
    this.setData({
      goodsList: [...this.data.goodsList, ...data.records],
      total: data.total,
      isLoading: false
    });
  },

  // 监听页面的上拉操作
  onReachBottom() {
    const { total, goodsList, requestData, isLoading } = this.data;
    let { page } = requestData;

    if (isLoading) return;

    // 判断数据是否加载完毕及后续代码...
  }
});

通过以上步骤,我们成功实现了上拉加载更多功能,并进行了加载完毕判断和节流优化。这些优化不仅提升了用户体验,还避免了不必要的请求浪费。希望本文对你有所帮助!

相关推荐
2501_915909068 分钟前
Ipa Guard 防护上架,混淆、重签名和回归测试怎么做
android·ios·小程序·https·uni-app·iphone·webview
鸿蒙开发4 小时前
# 代码写完才发现不能上线:微信小程序开发前必须准备的 8 件事
微信小程序·产品经理
李纲明4 小时前
微信小程序 web-view 打开空白或提示未配置业务域名:校验文件、HTTPS 与跳转域名排查
前端·微信小程序·https·web-view·小程序开发·业务域名
济南壹软网络科技有限公司5 小时前
盲盒源码系统小程序V6MAX底层架构解析,PHP+Uniapp高性能商用底座发布
小程序·架构·uni-app
2501_915918415 小时前
iOS 上架注意事项有哪些?Appuploader 的四个阶段自查清单
android·ios·小程序·https·uni-app·iphone·webview
Autumn_ing6 小时前
AI原型设计工具怎么选?可编辑原型与可运行前端适合什么场景
前端·小程序·产品经理·代码·codex·墨刀ai客户端·ai原型
fengGer的bugs6 小时前
微信小程序实战:本地存储的新生儿喂养记录(原生 + 四套主题 + 疫苗日程)
微信小程序·小程序
Ai-_Man7 小时前
我需要批量导出Poe左边栏所有对话,而不是一条具体的对话内容,你们AI导出鸭可以吗?
开发语言·前端·javascript·人工智能·小程序
青企通7 小时前
二手交易小程序的担保交易:资金托管、状态机与争议处理
小程序
andrsted1 天前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题