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

一、前情提要

  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)}
})

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电动机工作原理图

电机&#xff08;俗称“马达”&#xff09;是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩&#xff0c;作为用电器或各种机械的动力源。 电动机&#xff0c;转子置于旋转磁场中&#xff0c;在旋转磁场的作用下&#xff0c;获得一个转动力…

SSRF漏洞基础原理(浅层面解释 + 靶场演示)

一、SSRF漏洞的基本概念&#xff1a; SSRF--全名&#xff1a;Server-Side Request Forgery&#xff0c;汉译&#xff1a;服务端请求伪造&#xff0c;漏洞别名“借刀杀人”。 想象以下&#xff0c;现存在一个 Web应用&#xff0c;这个Web应用可以帮助我们能爬取互联网上的其他…

好的软件测试人员简历是什么样子的?

简历是入职职场的一张名片&#xff0c;也是进入职场一块“敲门砖”。从某种角度说&#xff0c;简历也是一张专业人员的说明书。 软件测试人员作为IT行业具有技术含量的职业&#xff0c;一份优秀的简历包含的内容以及如何写好简历尤为重要。接下来从以下两方面来介绍这个话题&a…

蓝桥杯算法错题记录

这里写目录标题 本文还在跟新&#xff0c;最新更新时间24/3/91. nextInt () next() nextLine() 的注意事项2 . 转换数据类型int ,string,charint -> string , charstring -> int ,charchar -> int , string 进制转换十六进制转化为10 进制 最大公约数 本文还在跟新&am…

都2024年了你还手动修改文件名?建筑设计行业的福音之Python自动化之按照图纸目录批量对pdf文件重命名

概述 在建筑设计行业里,各个专业的图纸交付有两种,一种是纸质的蓝图,一种是电子版图纸,电子版的图纸一般以PDF格式交付。而近年来随着各个地方开始推广各地的勘察设计行业设计施工图审查平台,要求所有的图纸都要上传PDF格式的图纸,每张图纸一个pdf文件,每个pdf的…

cannot import name ‘Flask‘ from partially initialized module ‘flask‘

bug&#xff1a; ImportError: cannot import name Flask from partially initialized module flask (most likely due to a circular import) (G:\pythonProject6\flask.py) 这个是因为包的名字和文件的名字一样 修改文件名&#xff1a; 结果 &#x1f923;&#x1f923;&…

preg_replace漏洞e模式函数执行

关于PHP函数preg_replace \e 模式函数执行漏洞 preg_replace&#xff1a; ​ 该函数执行一个正则表达式的搜索和替换。 ​ 语法&#xff1a; mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit -1 [, int &$count ]] )​ 搜索…

“删边“的并查集------反向并查集

目录 1.题目2.思路3.代码 默认大家都会并查集了 1.题目 小美认为&#xff0c;在人际交往中&#xff0c;但是随着时间的流逝&#xff0c;朋友的关系也是会慢慢变淡的&#xff0c;最终朋友关系就淡忘了。 现在初始有一些朋友关系&#xff0c;存在一些事件会导致两个人淡忘了他们…

如何系统地去学python

学习Python是一个非常有用的技能&#xff0c;无论您是想成为一名软件工程师、数据科学家还是想自动化日常任务&#xff0c;Python都是一个非常强大且流行的编程语言。但是&#xff0c;对于初学者来说&#xff0c;学习Python可能会感到有些困难和混乱。因此&#xff0c;本文将分…

Offer必备算法12_链表_五道力扣题详解(由易到难)

目录 ①力扣2. 两数相加 解析代码 ②力扣24. 两两交换链表中的节点 解析代码 ③力扣143. 重排链表 解析代码 ④力扣23. 合并 K 个升序链表 解析代码1&#xff08;小根堆优化&#xff09; 解析代码2&#xff08;递归_归并&#xff09; ⑤力扣25. K 个一组翻转链表 解…

MongoDB开启事务

MongoDB开启事务 配置单节点。到路径C:\Program Files\MongoDB\Server\4.0\bin 使用记事本以管理员权限打开文件mongod.cfg添加如下配置&#xff1a; replication:replSetName: rs02. 重启MongoDB服务 3. 重启后执行命令 rs.initiate()

使用`pyautogui`和`tkinter` 获取鼠标光标的位置

这段代码是一个简单的Python程序&#xff0c;使用pyautogui和tkinter库创建了一个窗口应用程序&#xff0c;用于获取鼠标光标的位置。 让我们逐行解释代码的功能&#xff1a; 1. #!/usr/bin/python3&#xff1a;这是一个Shebang行&#xff0c;用于指定脚本使用的解释器。 2.…

【蓝牙协议栈】【经典蓝牙】【BLE蓝牙】蓝牙协议规范(射频、基带链路控制、链路管理)

目录 1. 蓝牙协议规范&#xff08;射频、基带链路控制、链路管理&#xff09; 1.1 射频协议 1.2 基带与链路控制协议 1.3 链路管理器 1. 蓝牙协议规范&#xff08;射频、基带链路控制、链路管理&#xff09; 蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系…

wifi连接上后是怎么提供网络的?

干了六个月的网络协议栈&#xff0c;又回到了wifi老本行&#xff0c;所以我最近又开始研读 Android wifi fwk的源码了 之前还在干wifi的时候就思考过一个问题&#xff0c;wifi区别于蓝牙的一个很明显的点是&#xff0c;wifi可以提供 access to Internet 所以我想看看wifi连接成…

vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载

文章目录 导文文章重点内容效果展示&#xff1a;代码展示这些方法适用于哪些场景 总结 导文 vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载 文章重点 内容效果展示&#xff1a; 当div拉到底部的时候&#xff1a; 编辑器返回&#xff1a; 代码展示 在…

substr函数踩坑

##hive和impala的substr函数比对 ###在hive中substr函数使用 select substr(name,0,5) from bd_test; 结果&#xff1a;12345 select substr(name,1,5) from bd_test; 结果&#xff1a;12345 ###impala中substr函数使用 select substr(name,0,5) from bd_test; 结果&#xff…

JAVA后端开发面试基础知识(十)——设计模式

创建型模式 创建型模式的作用就是创建对象&#xff0c;说到创建一个对象&#xff0c;最熟悉的就是 new 一个对象&#xff0c;然后 set 相关属性。但是&#xff0c;在很多场景下&#xff0c;我们需要给客户端提供更加友好的创建对象的方式&#xff0c;尤其是那种我们定义了类&am…

BJFU|计算机网络缩写对照表

之前有过这个题型&#xff0c;但23年没考&#xff0c;所以按需准备 A ACK (ACKnowledgement) 确认 ADSL (Asymmetric Digital Subscriber Line) 非对称数字用户线 API (Applicatin Programming Interface) 应用编程接口 ARP (Address Resolution Protocol) 地址解析协议 ARQ (…

Git - Protocol

4.1 Git on the Server - The Protocols 至此&#xff0c;你应该可以完成大部分日常工作&#xff0c;而这些工作都需要用到 Git。不过&#xff0c;要在 Git 上进行任何协作&#xff0c;你都需要一个远程 Git 仓库。虽然从技术上讲&#xff0c;你可以推送改动到个人仓库&#xf…

银河麒麟服务器操作系统V10【vnc配置多用户登录】

1.添加多用户&#xff08;规划kingbase使用5901窗口&#xff0c;root使用5903&#xff09;&#xff1b; adduser kingbase 2.配置文件&#xff1b; cp -rp /lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.servicecp -rp /lib/systemd/system/vncse…