当前位置: 首页 > news >正文

微信小程序实现上拉加载更多

一、前情提要

  1. 微信小程序中实现上拉加载更多,其实就是pc端项目的分页。
  2. 使用的是scroll-view,scroll-view详情在微信开发文档/开发/组件/视图容器中。
  3. 每次上拉,就是在原有数据基础上,拼接/合并上本次上拉请求得到的数据。
  4. 这里采用的是concat,concat 是数组对象的一个方法,用于合并两个或多个数组,生成一个新的数组。这个方法不会修改原始数组,而是返回一个新的数组
  5. concat使用示例如下:
// 示例数组
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const array3 = [7, 8, 9];// 使用concat合并数组
const mergedArray = array1.concat(array2, array3);// 打印结果
console.log("原始数组1: ", array1);
console.log("原始数组2: ", array2);
console.log("原始数组3: ", array3);
console.log("合并后的数组: ", mergedArray);//输出结果应为:
原始数组1:  [1, 2, 3]
原始数组2:  [4, 5, 6]
原始数组3:  [7, 8, 9]
合并后的数组:  [1, 2, 3, 4, 5, 6, 7, 8, 9]

二、代码示例(1)不使用onReachBottom

  1. index.wxml
//1、scroll-y 允许纵向滚动
//2、lower-threshold="100px" 距底部/右边多远(100px)时,触发 scrolltolower 事件
//3、scroll-top="{{topHeight}}px" 设置竖向滚动条位置
<view class="box"><!-- 列表 --><scroll-view scroll-y lower-threshold="100px" bindscrolltolower="scrollToLower" style="height: 80vh;" scroll-top="{{topHeight}}px" class="scrView"><view class="listBox" wx:for="{{groupData}}" wx:key="id"><view class="name">{{item.name}}</view><view class="phone">{{item.mobile}}</view><image src="../../image/icon/bj.png" bindtap="editRecipient" data-item="{{item}}" class="mini-btn" /><image src="../../image/icon/sc.png" bindtap="deleteRecipient" data-id="{{item.id}}" class="mini-btn2" /></view><view style="text-align: center;"><view wx:if="{{loading}}">加载中...</view><view wx:if="{{noMore && !noData}}">没有更多了</view><view wx:if="{{noData}}">暂无数据</view></view></scroll-view>
</view>
  1. index.js
Page({data: {loading: false, //加载更多的loadingnoMore: false,   //没有更多了noData:false, //暂无数据isPage:false, // 是否需要分页 ispage的作用 进页面首次在onLoad中调用时,不需要合并数据page:1,limit:5,topHeight:0, },/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getContactList()},// restore函数的作用,当业务有搜索、删除、新增、编辑等操作时,需要还原对应参数状态。// 初始化数据restore(){this.setData({loading: false, //加载更多的loadingnoMore: false,   //没有更多了noData:false,isPage:false,page:1,limit:5,topHeight:0, })},getContactList(isPage){let params = {page:this.data.page,limit:this.data.limit,tid: this.data.inquirFform.tagID}req.group.contactList(params).then((res) =>{if (isPage) {// 下一页数据拼接在原始数据后面this.setData({groupData: this.data.groupData.concat(res.data.list),loading: false})} else {this.setData({groupData: res.data.list,loading: false})}//如果返回的数据为空,那么就没有下一页了if (res.data.list.length == 0 && this.data.isPage) {this.setData({noMore: true})}if (res.data.list.length == 0 && !this.data.isPage) {this.setData({noMore: true,noData:true})}})},// 下滑到底部触发scrollToLower(){if (!this.data.loading && !this.data.noMore) {this.setData({loading: true,page: this.data.page + 1,isPage:true})this.getContactList(this.data.isPage)}},
})

示例图片如下:
请添加图片描述

三、代码示例(2)使用onReachBottom(1)

onReachBottom:监听用户上拉触底事件。
可以在app.json的window选项中或页面配置中设置触发距离onReachBottomDistance。
在触发距离内滑动期间,本事件只会被触发一次。

  • 每次请求数据时候,在底部提示加载中

  • 当请求完全部数据时,在底部提示 没有更多数据了,
    后端返回数据总条数 如下.js文件中的 total 判断 每次请求时判断前端拿到的总数据的length == total,若是等于 则显示 没有更多数据了,并且 再次上拉时,不进行数据的请求。

  • 前端传 page 当前页 每次请求 page + 1
    limit:没有数量 前端自己写个固定值就行
    业务参数:若列表支持查询搜索等,传自己的业务数据

  • 后端返回 total:总数据条数
    data:[] 对应的数据列表

  • 有导航切换的需要注意,切换导航后先重置 加载中提示,没有更多数据提示,page等参数后,在请求数据

、、、
1、wxml

<view class="content"><view class="body"><view class="box" wx:for="{{proArr}}" wx:key="_id"><xzs-product-item item="{{item}}"></xzs-product-item></view></view><view class="loadOut"><van-loading size="24px" wx:if="{{loading}}">加载中...</van-loading><view class="noData" wx:if="{{isData}}">没有更多数据了~</view></view>
</view>
```';

3、.js


Page({/*** 页面的初始数据*/data: {navActive:0,navArr:[],proArr:[],page:1,limit:10,loading:false,isData:false},/*** 生命周期函数--监听页面加载*/async onLoad(options) {let {idx} = options;    await this.getNavList(); if(idx){this.navChange(idx);}else{navid = this.data.navArr[0]._id;this.getProductList();}},//获取产品列表getProductList(){this.setData({loading:true})queryProduct({navid:navid,page:this.data.page,limit:this.data.limit}).then(res=>{   let oldArr= this.data.proArr;let newArr=oldArr.concat(res.data)   console.log(res);this.setData({proArr:newArr,loading:false})if(res.total == this.data.proArr.length){this.setData({isData:true})}})},//导航条切换事件navChange(e){    let index= e?.detail?.index ?? e;navid = this.data.navArr[index]._idthis.setData({proArr:[],loading:false,isData:false,page:1,navActive:Number(index)})    this.getProductList();},/*** 页面上拉触底事件的处理函数*/onReachBottom() {if(this.data.isData) return;this.setData({page:this.data.page + 1})this.getProductList()},
})

四、代码示例(2)使用onReachBottom(2)

  • 这个同 三、代码示例(2)类似,只不过是请求时传递给后端的参数不同
  • 前端传 size: 就是列表数据的长度,初始是0。例如:第一次,请求得到数据长度为5 ,那么上拉数据请求时候,size就传5,再次上拉,合并数据后长度为10,下次上拉请求就传10

1、.wxml

<view class="content"><view class="body"><view class="box" wx:for="{{proArr}}" wx:key="_id"><xzs-product-item item="{{item}}"></xzs-product-item></view></view><view class="loadOut"><van-loading size="24px" wx:if="{{loading}}">加载中...</van-loading><view class="noData" wx:if="{{isData}}">没有更多数据了~</view></view>
</view>

2、.js

Page({/*** 页面的初始数据*/data: {navActive:0,navArr:[],proArr:[],loading:false,isData:false},/*** 生命周期函数--监听页面加载*/async onLoad(options) {this.getProductList();},//获取产品列表getProductList(s=0){this.setData({loading:true})queryProduct({navid:navid,size:s}).then(res=>{   let oldArr= this.data.proArr;let newArr=oldArr.concat(res.data)   console.log(res);this.setData({proArr:newArr,loading:false})if(res.total == this.data.proArr.length){this.setData({isData:true})}})},//导航条切换事件navChange(e){    let index= e?.detail?.index ?? e;navid = this.data.navArr[index]._idthis.setData({proArr:[],loading:false,isData:false,navActive:Number(index)})    this.getProductList();},/*** 页面上拉触底事件的处理函数*/onReachBottom() {if(this.data.isData) return;this.getProductList(this.data.proArr.length)}
})

三和四几乎一样,就看前后端怎么约定的穿什么数据,返回什么数据

相关文章:

微信小程序实现上拉加载更多

一、前情提要 微信小程序中实现上拉加载更多&#xff0c;其实就是pc端项目的分页。使用的是scroll-view&#xff0c;scroll-view详情在微信开发文档/开发/组件/视图容器中。每次上拉&#xff0c;就是在原有数据基础上&#xff0c;拼接/合并上本次上拉请求得到的数据。这里采用…...

计算机网络——概述

计算机网络——概述 计算机网络的定义互连网&#xff08;internet&#xff09;互联网&#xff08;Internet&#xff09;互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…...

kafka Interceptors and Listeners

Interceptors ProducerInterceptor https://www.cnblogs.com/huxi2b/p/7072447.html Producer拦截器(interceptor)是个相当新的功能&#xff0c;它和consumer端interceptor是在Kafka 0.10版本被引入的&#xff0c;主要用于实现clients端的定制化控制逻辑。 对于producer而言&…...

【面试题】mysql常见面试题及答案总结

事务中的ACID原则是什么? Mysql是如何实现或者保障ACID的? ACID原则是数据库事务管理中必须满足的四个基本属性&#xff0c;确保了数据库事务的可靠性和数据完整性。 简写全称解释实现A原子性&#xff08;Atomicity&#xff09;一个事务被视为一个不可分割的操作序列&#…...

C++ 类的前向声明的用法

我们知道C的类应当是先定义&#xff0c;然后使用。但在处理相对复杂的问题、考虑类的组合时&#xff0c;很可能遇到俩个类相互引用的情况&#xff0c;这种情况称为循环依赖。 例如&#xff1a; class A { public:void f(B b);//以B类对象b为形参的成员函数//这里编译错位&…...

二分查找(c语言)

二分查找 一.什么是二分查找二.代码实现 一.什么是二分查找 在⼀个升序的数组中查找制定的数字n&#xff0c;很容易想到的⽅法就是遍历数组&#xff0c;但是这种⽅法效率⽐较低&#xff0c; ⽐如我买了⼀双鞋&#xff0c;你好奇问我多少钱&#xff0c;我说不超过300元。你还是好…...

【记录31】elementUI el-tree 虚线、右键、拖拽

父组件 <eltree :treeData"treeData"></eltree>import eltree from "../../components/tree.vue"; export default {name: ,components: { // org_tree ,eltree},watch: {},data() {return {orgFormchoose: {},orgForm: { type: 0, limits: 1…...

【C++】函数重载

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;函数重载的定义 &#x1f4cc;函数重载的三种类型 &#x1f38f;参数个数不同 &#x1f38f;参数类型不同 &#x1f38f;参数类型顺序不同 &#x1f4cc;重载…...

【深度学习模型】6_3 语言模型数据集

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.3 语言模型数据集&#xff08;周杰伦专辑歌词&#xff09; 本节将介绍如何预处理一个语言模型数据集&#xff0c;并将其转换成字符级…...

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在当今数据爆炸的时代&#xff0c;数据库作为存储和管理数据的核心组件&#xff0c;其性能和扩展性成为了企业关注的重点。随着业…...

React改变数据【案例】

State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…...

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…...

Rust: Channel 代码示例

在 Rust 中&#xff0c;通道&#xff08;Channel&#xff09;通常使用 std::sync::mpsc&#xff08;多生产者单消费者&#xff09;或 tokio::sync::mpsc&#xff08;在异步编程中&#xff0c;特别是使用 Tokio 运行时&#xff09;来创建。下面是一个使用 std::sync::mpsc 的简单…...

基于华为atlas的unet分割模型探索

Unet模型使用官方基于kaggle Carvana Image Masking Challenge数据集训练的模型。 模型输入为572*572*3&#xff0c;输出为572*572*2。分割目标分别为&#xff0c;0&#xff1a;背景&#xff0c;1&#xff1a;汽车。 Pytorch的pth模型转化onnx模型&#xff1a; import torchf…...

机器学习--循环神经网络(RNN)1

一、简介 循环神经网络&#xff08;Recurrent Neural Network&#xff09;是深度学习领域中一种非常经典的网络结构&#xff0c;在现实生活中有着广泛的应用。以槽填充&#xff08;slot filling&#xff09;为例&#xff0c;如下图所示&#xff0c;假设订票系统听到用户说&…...

基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54

摘 要 人类现已进入21世纪&#xff0c;科技日新月异&#xff0c;经济、信息等方面都取得了长足的进步&#xff0c;特别是信息网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利&#xff0c;开发一套基于java的大学生…...

【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)

0x01 产品简介 Linksys E2000是一款由思科&#xff08;Cisco&#xff09;品牌推出的无线路由器&#xff0c;它是一款支持2.4GHz和5GHz双频段的无线路由器&#xff0c;用户可以避开拥挤的2.4GHz频段&#xff0c;独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…...

小白跟做江科大51单片机之DS1302可调时钟

原理部分 1.DS1302可调时钟介绍 单片机定时器主要占用CPU时间&#xff0c;掉电不能继续运行 图1 2.原理 图2 内部有寄存器&#xff0c;寄存的时候以时分秒寄存&#xff0c;以通信协议实现数据交互&#xff0c;就可以实现对数据进行访问和读写 3.主要寄存器定义 CE芯片使能…...

2024蓝桥杯每日一题(归并排序)

一、第一题&#xff1a;火柴排队 解题思路&#xff1a;归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …...

生成对抗网络 (GAN)

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成&#xff1a;一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Discriminator&#xff09;&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...