简洁高效的微信小程序分页器封装实践

前言

在现今的移动应用开发中,微信小程序已经成为了一个备受欢迎的平台。然而,随着应用的复杂性增加,数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念:封装分页器,它是提升小程序性能和用户体验的不可或缺的工具之一。通过深入了解分页器的工作原理以及如何正确地封装和使用它,大家将能够更好地管理和加载数据,从而为你的小程序带来更出色的性能和用户体验。


实现效果

在这里插入图片描述


封装公共方法

wxml 文件

首先,在视图层(WXML)中,创建了一个包含分页相关元素的自定义组件,包括总数据条数的展示、每页显示条数的下拉框、当前页码的展示、上一页和下一页的按钮、前往页码的输入框。

<view class="mainBox"><view class="paginationBox"><view class="totalBox">共 {{total}} 条</view><view class="selectPageBox"><picker bindchange="handlePageSizeChange" value="{{pageSizeIndex}}" range="{{pageSizes}}"><view>{{pageSizes[pageSizeIndex]}}条/页</view></picker></view><view class="contantBox"><view style="color:{{pageNum<=1 ? 'rgb(194,201,213)' : 'rgb(25, 137, 250)'}}" class="updownPageBox" bindtap="prevPage"><van-icon name="arrow-left" /></view><view class="pageBox">{{pageNum}}</view><view style="color:{{pageNum >= (total / pageSize) ? 'rgb(194,201,213)' : 'rgb(25, 137, 250)'}}" class="updownPageBox" bindtap="nextPage"><van-icon name="arrow" /></view></view><view class="intBox"><text>前往</text><input class="intConBox" bindconfirm="handlePageConfirm" type="number" /><text></text></view></view>
</view>

js 文件

  • 在组件的属性(properties)中定义了三个属性:totalpageSizepageNum,用于控制分页的相关数据。其中,total 表示总数据条数,pageSize 表示每页显示条数,pageNum 表示当前页码。同时,在 pageNum 属性中定义了一个观察者函数,用于在 pageNum 属性变化时更新数据中的 pageNum
  • 定义了数据(data)中的一些变量,包括每页显示条数选项 pageSizes 和默认选中的每页显示条数 pageSizeIndex
  • methods 中定义了一些方法,实现了分页功能:
    • prevPage 方法:用于点击上一页按钮,减小 pageNum,但要确保 pageNum 大于 1,触发自定义事件 pageChange 传递当前页码信息;
    • nextPage 方法:用于点击下一页按钮,增加 pageNum,但要确保 pageNum 小于最大页数,触发自定义事件 pageChange 传递当前页码信息;
    • handlePageSizeChange 方法:用于选择每页显示条数的下拉框,更新 pageSizepageSizeIndex,触发自定义事件 pageSizeChange 传递每页显示条数信息;
    • handlePageConfirm 方法:用于页码输入框的确认操作,获取输入的页码并转换为整数,确保输入的页码在有效范围内,然后更新 pageNum,触发自定义事件 pageChange 传递当前页码信息;
    • 自定义事件 pageChangepageSizeChange 可以在使用该组件的父组件中监听,以便在分页信息发生变化时执行相应的逻辑操作。
Component({properties: {total: { // 总数据条数type: Number, // 数据类型为数字value: 0 // 默认值为0},pageSize: { // 每页显示条数type: Number, // 数据类型为数字value: 10 // 默认值为10},pageNum: { // 当前页码type: Number, // 数据类型为数字value: 1, // 默认值为1observer(newVal) { // 当pageNum属性变化时触发的观察者函数this.setData({pageNum: newVal // 更新数据中的pageNum});}}},data: {pageSizes: [5, 10, 15, 20], // 每页显示条数选项pageSizeIndex: 1, // 默认选中的每页显示条数},methods: {// 上一页prevPage() {if (this.data.pageNum > 1) { // 如果当前页码大于1this.setData({pageNum: this.data.pageNum - 1 // 减小pageNum});this.triggerEvent('pageChange', { // 触发名为'pageChange'的自定义事件,传递当前页码信息page: this.data.pageNum});} else {wx.showToast({title: '已经是第一页',icon: 'none'});}},// 下一页nextPage() {const maxPage = Math.ceil(this.data.total / this.data.pageSize); // 计算最大页数if (this.data.pageNum < maxPage) { // 如果当前页码小于最大页数this.setData({pageNum: this.data.pageNum + 1 // 增加pageNum});this.triggerEvent('pageChange', { // 触发名为'pageChange'的自定义事件,传递当前页码信息page: this.data.pageNum});} else {wx.showToast({title: '已经是最后一页',icon: 'none'});}},// 每页显示条数下拉框handlePageSizeChange(event) {const index = event.detail.value; // 获取选择的索引const pageSize = this.data.pageSizes[index]; // 获取对应索引的每页显示条数this.setData({pageSize, // 更新pageSizepageSizeIndex: index, // 更新pageSizeIndex});this.triggerEvent('pageSizeChange', { // 触发名为'pageSizeChange'的自定义事件,传递每页显示条数信息pageSize});},// 页码输入框handlePageConfirm(event) {const inputValue = event.detail.value.trim(); // 获取去掉前后空格的输入值if (inputValue === '') {// 如果输入值为空,则不执行查询操作return;}const page = parseInt(inputValue); // 获取输入的页码并转换为整数const maxPage = Math.ceil(this.data.total / this.data.pageSize); // 计算最大页数if (page >= 1 && page <= maxPage) { // 如果输入的页码有效this.setData({pageNum: page // 更新pageNum});this.triggerEvent('pageChange', { // 触发名为'pageChange'的自定义事件,传递当前页码信息page});} else {wx.showToast({title: '请输入有效页数',icon: 'none'});}}}
});

wxss 文件

.paginationBox {margin-top: 20rpx;font-size: 28rpx;display: flex;align-items: center;justify-content: flex-end;
}.totalBox {color: #606266;height: 48rpx;line-height: 48rpx;
}.selectPageBox {border: 2rpx solid #dcdfe6;margin: 0rpx 14rpx;color: #606266;padding: 0rpx 18rpx;text-align: center;height: 44rpx;line-height: 44rpx;border-radius: 4rpx;
}.contantBox {display: flex;
}.updownPageBox,
.pageBox {padding: 0rpx 14rpx;color: rgb(25, 137, 250);background-color: rgb(244, 244, 245);height: 48rpx;line-height: 48rpx;border-radius: 4rpx;
}.pageBox {margin: 0rpx 10rpx;
}.intBox {margin-left: 14rpx;color: #606266;display: flex;align-items: center;
}.intBox input {height: 44rpx;line-height: 44rpx;min-height: 44rpx;
}.intConBox {border: 2rpx solid #dcdfe6;border-radius: 4rpx;width: 60rpx;text-align: center;margin: 0rpx 6rpx;
}

app.json 文件全局引用

"usingComponents": {"pagination": "./components/pagination/index"
},

任意文件使用

wxml 文件

<view class="tableBox"><scroll-view scroll-x><view class="table"><view class="tableRow"><text class="tableNavBox">Header 1</text><text class="tableNavBox">Header 2</text><text class="tableNavBox">Header 3</text></view><view class="tableRow" wx:for="{{list}}" wx:key="index"><text class="tableCellBox">{{item.ffzt}}</text><text class="tableCellBox">{{item.fdjccrq}}</text><text class="tableCellBox">{{item.gl}}</text></view></view></scroll-view><!-- 分页组件 --><view><pagination total="{{total}}" pageSize="{{pageSize}}" currentPage="{{currentPage}}" bind:pageChange="handlePageChange" bind:pageSizeChange="handlePageSizeChange"></pagination></view>
</view>

js 文件

var app = getApp(); // 获取小程序应用实例
Page({data: {list: [], // 存储数据列表pageNum: 1, // 当前页码total: 0, // 数据总数pageSize: 10, // 每页显示条数},onLoad: function () {this.tableOn(); // 在页面加载时调用tableOn函数},tableOn() {let that = this; // 缓存this,以在回调函数中使用// 发起网络请求获取数据wx.request({url: app.API_URL + 'yourUrl', // 请求的URLdata: {rows: {pageNum: that.data.pageNum, // 当前页码pageSize: that.data.pageSize, // 每页显示条数},},success: function (res) {that.setData({list: res.data.list, // 更新数据列表total: res.data.pagejx.areaNum, // 更新数据总数});},});},// 处理分页组件页码变化事件handlePageChange(event) {this.setData({pageNum: event.detail.page, // 更新当前页码});this.tableOn(); // 重新加载数据},// 处理分页组件每页显示条数变化事件handlePageSizeChange(event) {this.setData({pageNum: 1, // 重置页码为1pageSize: event.detail.pageSize, // 更新每页显示条数});this.tableOn(); // 重新加载数据},
});

相关推荐

⭐ 用vue封装分页器,让你的页面简单而不失优雅

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

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

相关文章

Python实现WOA智能鲸鱼优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

【Linux】-文件系统的详解以及软硬链接

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

说说你对React Router的理解?常用的Router组件有哪些?

一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单页(SPA)应用 react-router主要分成了几个不…

香港和美国节点服务器的测试IP哪里有?

在选择服务器时&#xff0c;我们通常需要进行一些测试来评估其性能和稳定性。当然&#xff0c;这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址&#xff0c;我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

docker简介和安装

0.前提 本文章意在告诉各位开发者学生有一个工具能够方便你未来的项目开发和部署&#xff0c;这也是我在给我留下一份备份&#xff0c;在我忘记的时候可以回头寻找。 1.docker简介 docker本身就有集装箱的意思。Docker: Accelerated Container Application Development Dock…

基于单片机智能浇花系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机智能浇花系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能浇花系统可以实现自动化浇水、测土湿度和温度等功能&#xff0c;以下是一个基本的仿真设计步骤&am…

【深度学习】pytorch——常用工具模块

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——常用工具模块 数据处理 torch.utils.data模块DatasetDataLoadersamplertorch.utils.data的使用 计算机视觉工具包 torchvisiontorchvision.d…

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用(二)

Com.Gitusme.Net.Extensiones.Core 扩展库 1.0.6 版本已发布。 1、版本变更说明 新增Sokcet套接字扩展。简化Socket操作&#xff0c;支持自定义命令封装&#xff0c;使用方便快捷&#xff0c;让您聚焦业务实现&#xff0c;而不必关心底层逻辑&#xff0c;提高开发效率。日志功…

# Spring事务与分布式事务

一、事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元&#xff0c;组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交&#xff0c;只要其中任一操作执行失败&#xff08;出现异常&#xff09;&#xff0c;都将导致整个事务…

场景案例∣企业如何打造数智采购商城,赋能企业提速降本增效

从1998年第一个电商平台成立至今&#xff0c;已经有25年。 随着数字化经济加快发展&#xff0c;大数据、云计算、物联网及人工智能的进一步应用&#xff0c;近年来电商化采购模式也强势崛起&#xff0c;在企业采购领域掀起革命性的巨浪。 而随着市场需求的变化多样&#xff0c;…

拆解软件定义汽车:OS突围

软件作为智能汽车的核心组成部分&#xff0c;由于自身较为独立和复杂的IT学科体系&#xff0c;其技术链路、产业分工、价值分配、商业模式相对硬件产品&#xff08;如域控、激光雷达、摄像头等硬件&#xff09;而言&#xff0c;在汽车产业内探讨和传播相对较少。 11月3日&…

pytorch-gpu(Anaconda3+cuda+cudnn)

文章目录 下载Anaconda3安装&#xff0c;看着点next就行比较懒所以自动添加path测试 cuda安装的时候不能改路径如果出现报错&#xff0c;关闭杀毒软件一直下一步就好取消勾选“CUDA”中的“Visual Studio Intergration”一直下一步即可测试安装成功 cudnn解压后将这三个文件夹复…

【大模型】大语言模型语料下载

文章目录 概述Hugging Faceobs操作git-lfs例子RedPajama-Data-1TSlimPajama-627B/git clone续传 数据格式参考资料 概述 大模型训练中语料是非常重要的&#xff0c;目前公网上有各种各样的语料可以供下载&#xff0c;但是不可能每个用户、每次训练任务都通过公网去拉取语料&am…

VS设置--查看引用库源代码

1.工具-->选项-->文本编译器-->C#-->高级-->勾选支持导航到反编译源(试验)

du_命令可以像find_命令那样列出最大的文件吗

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等_厦门微思网络的博客-CSDN博客文章浏览阅读418次。风和日丽&#xff0c;小微给你送福利~如果你是小微的老粉&#xff0c;这里有一份粉丝福利待领取...如果你是新粉关注到了小微&am…

关于论文图表目录和交叉引用的使用小结

目录 1 题注用法 2 交叉引用 最近在写论文&#xff0c;遇到不少Word使用的问题(错误&#xff01;文档中没有指定样式的文字。) 网上其实也有很多解决方案但我当时还是折腾了几个小时才整出来图目录&#xff0c;以下是针对我目前使用的感觉简明很多的方法。 1 题注用法 1) 假…

基于LDPC编译码和FP-MAP球形检测算法的协作MIMO系统误码率matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 LDPC码 4.1 Fincke-Pohst-MAP球形检测算法 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2017b 3.部分核心程序 .........................................…

CLK_CFG_AD9516时钟芯片(配置代码使用说明)

目录 1 概述2 例程功能3 例程端口4 数据时序5 注意事项6 调用例程7附录&#xff08;代码以及寄存器&#xff09; 1 概述 本文用于讲解CLK_CFG_AD9516例程配置代码的使用说明&#xff0c;方便使用者快速上手。 2 例程功能 本例程 是采用verilog hdl编写&#xff0c;实现AD951…

以太网和局域网

计算机网络的定义 计算机网络是一个将分散的、具有独立功能的计算机&#xff0c;通过通信设备与线路连接起来&#xff0c;由根据协议编写的软件来实现的资源共享和信息传递的系统 计算机网络的分类 广域网是互联网的核心部分 局域网 常见的局域网拓扑结构有4大类&#xff1a…

关于start-burp抓包夜神-系统证书导入

1、开启开发中模式 2、开启USB调试 3、开启端口监听并下载start-burp证书 4、证书在线格式转换 根据该网站【在线DER格式转pem CER格式转pem CRT格式转PEM证书格式--查错网】也可以搜索其它在线转换网站进行操作 新建一个文本文件重名为【9a5ba575.0】&#xff0c;将转换的内…