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

news/2024/10/21 10:14:45/

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

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

实现上拉加载

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

实现步骤

  1. 声明onReachBottom事件处理函数
    .js文件中,声明onReachBottom方法,用于监听用户的上拉行为。

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

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

import { reqGoodsList } from '../../../api/goods';Page({data: {goodsList: [], // 商品列表数据total: 0, // 列表总数据量requestData: {page: 1, // 页码limit: 10, // 每页请求多少条数据category1Id: '', // 一级分类 idcategory2Id: '' // 二级分类 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. 对比totalgoodsList的长度
    onReachBottom方法中,对比后端返回的total和当前goodsList的长度,如果相等则说明数据已加载完。

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

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状态
    如果isLoadingtrue,则不进行下一页数据的加载。

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;// 判断数据是否加载完毕及后续代码...}
});

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


http://www.ppmy.cn/news/1538679.html

相关文章

【096】基于SpringBoot+Vue实现的私人健身与教练预约管理系统

系统介绍 视频演示 基于SpringBootVue实现的私人健身与教练预约管理系统 文档 PPT 源码 数据库脚本 课程设计 基于SpringBootVue实现的私人健身与教练预约管理系统采用前后端分离的架构方式开发,系统整体设计了管理员、教练、用户三种角色,实现了用户查…

爬虫案例——网易新闻数据的爬取

案例需求: 1.爬取该新闻网站——(网易新闻)的数据,包括标题和链接 2.爬取所有数据(翻页参数) 3.利用jsonpath解析数据 分析: 该网站属于异步加载网站——直接网页中拿不到,需要…

代码随想录算法训练营| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目 参考文章 思路:这题其实就是删除不符合上下边界的节点。注意:这里删除不符合上下边界节点时,这个不符合上下边界的节点的左或右子树可能存在符合上下边界的节点,所i有每次比较完之后,要继…

C语言-文件IO

文件IO I :input 输入,从文件中读取数据到内存 O:output 输出,把数据写入到文件 Linux系统IO 和 c语言标准IO 1、linux系统IO 1.1 简介 linux操作系统把对文件的操作封装成了多个函数,统称为linux系统IO。 文件描述符(File descirptor)…

ResNet模型

使用pytoch实现 1.卷积神经网络 conv2d的参数很简单 conv2d(input_channels, output_channels,kernel_size, stride, padding) 参数分别是输入通道,输出通道,卷积核大小,移动步长,填充数量。 输入通道是特征图的深度&#xff0c…

【详细教程】如何使用YOLOv11进行图像与视频的目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

MySQL 8.4修改初始化后的默认密码

MySQL 8.4修改初始化后的默认密码 (1)初始化mysql: mysqld --initialize --console (2)之后,mysql会生成一个默认复杂的密码,如果打算修改这个密码,可以先用旧密码登录: mysql -u…

vite 打包前请求接口和打包后的不一致

在使用 Vite 进行项目打包时,如果发现打包前请求接口和打包后的行为不一致,这可能是由于多种原因导致的。以下是一些可能的原因和相应的解决方案: 1. 代理配置问题 开发环境:在开发环境中,Vite 通常使用 vite.config…