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

前言

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


实现效果

在这里插入图片描述


封装公共方法

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.rhkb.cn/news/191182.html

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

相关文章

聚观早报 |滴滴发布Q3财报;小鹏G9连续销量排行第一

【聚观365】11月14日消息 滴滴发布Q3财报 小鹏G9连续销量排行第一 XREAL双11实现7倍增长 真我GT5 Pro真机图 2024年智能手机AI功能竞争激烈 滴滴发布Q3财报 滴滴在其官网发布2023年三季度业绩报告。报告显示&#xff0c;三季度滴滴实现总收入514亿元&#xff0c;同比增长…

④【数据查询】MySQL查询语句,拿来即用。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL查询操作 ④【数据查询】MySQL查询语句&a…

Docker 中的端口

Docker 中的端口 0.0.0.0:8080->80/tcp &#xff0c;主机&#xff08;即运行 Docker 的机器&#xff09;监听8080端口&#xff0c;如果有请求转发到容器的 80 端口上去。 详细解释一下&#xff1a; 0.0.0.0:8080->80/tcp &#xff1a;这是一个端口映射规则。 0.0.0.0:80…

如何保护电动汽车充电站免受网络攻击

根据国际能源署 (IEA) 的一份报告&#xff0c;如今&#xff0c;全球销售的汽车中约有七分之一是电动汽车。虽然这对环境来说是个好消息——有可能使占总碳排放量16% 的道路交通脱碳——但这也带来了针对电动汽车充电站的网络攻击日益严重的威胁。 电动汽车充电站、数据流网络和…

PyCharm因安装了illuminated Cloud插件导致加载项目失败

打开Pycharm时会有弹窗提示&#xff1a; The license for Illuminated Cloud is invalid or has expired. All Illuminated Cloud features will be disabled. 这个弹窗会导致你加载项目一直失败&#xff0c;close project 也关不掉&#xff0c;我都是用任务管理器杀死进程的…

家政服务小程序源码系统+上门预约服务 源码完全开源可二次开发 带完整的搭建教程

在互联网的快速发展下&#xff0c;传统的家政服务行业也在逐步向数字化、智能化方向转型。为了满足消费者对于家政服务的高品质需求&#xff0c;罗峰给大家分享一款基于微信小程序的上门预约家政服务系统。该系统采用完全开源的源码系统&#xff0c;可进行二次开发&#xff0c;…

vscode调试react 最初的源码

如果直接在react项目中打点调试, 调试的是 react-dom.development.js, 而源码里这些逻辑是分散在不同的包里的,如何才能够调试 React 最初的源码呢&#xff1f; JS 代码经过编译&#xff0c;会产生目标代码&#xff0c;但同时也会产生 sourcemap。sourcemap 的作用就是映射目…

[CANN训练营]UART通信笔记

文章目录 前言一、前提知识1.串行通信2.并行通信3.单工、半双工、全双工通信3.1单工通信3.2半双工通信3.3全双工通信 4.补充&#xff1a;通信速率 二、UART通信1.UART通信2.UART工作原理 总结 前言 在ROS学习中&#xff0c;我们在入门基础除了ROS的小乌龟外&#xff0c;在通信…

基于检索增强生成的LLM应用开发实战【】

大型语言模型&#xff08;LLM&#xff09;无疑改变了我们与信息交互的方式。 然而&#xff0c;对于我们可以向他们提出的要求&#xff0c;它们也有相当多的限制。 LLM&#xff08;例如 Llama-2-70b、gpt-4 等&#xff09;仅了解他们接受过训练的信息&#xff0c;当我们要求他们…

通信原理板块——语音压缩编码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、语音压缩编码 语音压缩编码可以…

接口开放太麻烦?试试阿里云API网关吧

前言 我在多方合作时&#xff0c;系统间的交互是怎么做的&#xff1f;这篇文章中写过一些多方合作时接口的调用规则和例子&#xff0c;然而&#xff0c;接口开放所涉及的安全、权限、监控、流量控制等问题&#xff0c;可不是简简单单就可以解决的&#xff0c;这一般需要专业的…

Cnyunwei

运维管理系统&#xff1a;监控系统 Cnyunwei Centos 6 封装 Cacti、Nagios、Centreon&#xff08;中英文自己切换&#xff09;、Check_MK、Nconf英文版本全部采用与国外官方同步的最新版本&#xff0c;会发布32位和64位两个版本。 安装很简单&#xff0c;直接回车即可全自动安…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

高效攻略各类BOSS,成为真正的剑侠!

逆水寒作为一款备受瞩目的国产武侠游戏&#xff0c;其精美的画面和真实的剑术体验吸引了众多玩家。在这篇实用干货分享中&#xff0c;我们将详细介绍一些攻略各类BOSS的技巧和策略&#xff0c;帮助你在游戏中轻松击败强大的对手&#xff0c;成为真正的剑侠大师。 首先&#xff…

【机器学习基础】机器学习入门(1)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;专栏介绍&#xff1a; 本专栏的第一篇文章&#xff0c;当然要介绍一下了~来说一下这个专栏的开…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线&#xff0c;那估计…

记录pytorch实现自定义算子并转onnx文件输出

概览&#xff1a;记录了如何自定义一个算子&#xff0c;实现pytorch注册&#xff0c;通过C编译为库文件供python端调用&#xff0c;并转为onnx文件输出 整体大概流程&#xff1a; 定义算子实现为torch的C版本文件注册算子编译算子生成库文件调用自定义算子 一、编译环境准备…

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

sass 封装媒体查询工具

背景 以往写媒体查询可能是这样的&#xff1a; .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …

Linux下MSSQL (SQL Server)数据库无法启动故障处理

有同事反馈一套CentOS7下的mssql server2017无法启动需要我帮忙看看&#xff0c;启动报错情况如下 检查日志并没有更新日志信息 乍一看mssql-server服务有问题&#xff0c;检查mssql也确实没有进程 既然服务有问题&#xff0c;那么我们用一种方式直接手工后台启动mssql引擎来…