element-react Pagination 分页组件:layout 布局、属性事件与源码实现全解析
前端UI组件设计系统【免费下载链接】element-reactElement UI项目地址https://gitcode.com/gh_mirrors/el/element-react点击查看免费下载当数据量超出单页可承载范围时分页是 React 管理后台与数据列表中几乎必用的交互模式。本文基于 element-reactElement UI 的 React 版本仓库中的官方文档site/docs/en-US/pagination.md展开完整覆盖 Pagination 组件的layout布局系统、全部属性与事件并结合src/pagination/目录下的源码实现讲清页码裁剪算法、当前页钳制逻辑、每页条数联动等底层原理帮助你不仅会用组件还能预判其边界行为。Pagination 组件概览element-react 将 Pagination 作为具名导出提供入口在 src/index.jsexport { default as Pagination } from ./pagination;而 src/pagination/index.js 直接转发默认导出真正的实现全部集中在 src/pagination/Pagination.jsx 与页码列表子组件 src/pagination/Pager.jsx 两个文件中。组件的 TypeScript 声明位于 typings/index.d.ts官方文档页则通过 site/pages/pagination/index.jsx 读取本目录对应的 Markdown 渲染而成。组件的核心设计只有一个思想用一条layout字符串描述要显示哪些子模块顺序即排列顺序。从 Pagination.jsx 的render()可以看到layout被按逗号切分后逐项映射到内部的TEMPLATE_MAP// src/pagination/Pagination.jsx节选 const components layout.split(,).map(item item.trim()); const TEMPLATE_MAP { prev: Pre .../, jumper: Jumper .../, pager: Pager .../, next: Next .../, sizes: Sizes .../, total: Total .../ }; components.forEach(compo { if (compo ! -) { children.push(TEMPLATE_MAP[compo]); } });也就是说layout中每一项要么命中TEMPLATE_MAP渲染对应子组件要么被忽略——这正是后续所有附加模块示例能够任意组合的基础。基础用法用 layout 控制布局官方文档给出两个典型场景页数较少total{50}默认pageSize为 10共 5 页与页数超过 7 页total{1000}共 100 页render() { return ( div classNamefirst div classNameblock span classNamedemonstrationWhen you have few pages/span Pagination layoutprev, pager, next total{50}/ /div div classNameblock span classNamedemonstrationWhen you have more than 7 pages/span Pagination layoutprev, pager, next total{1000}/ /div /div ) }layout支持的元素逗号分隔顺序即显示顺序元素含义prev上一页按钮next下一页按钮pager页码列表jumper跳页输入框total总条目数文本sizes每页条数选择器文档正文中也写作size实际 layout 中须写sizes-布局分隔符文档约定该符号之后的元素靠右显示这里有两个值得注意的实现细节空 layout 直接不渲染。render()中有if (!layout) return null;即不传layout的组件是空的-在源码中只被跳过。从 Pagination.jsx 的结构看forEach循环遇到-时不 push 任何组件同时className中el-pagination__rightwrapper被固定为false见 L305-L309。因此该 React 版本中-不产生独立 DOM右对齐效果由组件样式层承担使用时遵循文档语义书写即可。组件的默认布局在 Pagination.defaultProps 中定义Pagination.defaultProps { small: false, pageSize: 10, currentPage: 1, layout: prev, pager, next, jumper, -, total, pageSizes: [10, 20, 30, 40, 50, 100] };这与文档 Attributes 表中layout的默认值一致。小型分页small空间有限时使用小型分页只需把small设为truerender() { return Pagination layoutprev, pager, next total{50} small{true}/ }源码中该属性直接映射为 BEM 修饰类见 Pagination.jsxconst className this.classNames({ el-pagination: true, el-pagination__rightwrapper: false, el-pagination--small: this.props.small });即small为true时根节点附加el-pagination--small类尺寸变化完全由样式表驱动JS 逻辑不受影响。附加功能total、sizes、jumper官方文档More elements一节给出了完整用例分别演示显示总数、调整每页条数、跳页以及全功能组合render() { return ( div classNamelast div classNameblock span classNamedemonstrationTotal item count/span Pagination layouttotal, prev, pager, next total{1000}/ /div div classNameblock span classNamedemonstrationChange page size/span Pagination layoutsizes, prev, pager, next total{1000} pageSizes{[100, 200, 300, 400]} pageSize{1000}/ /div div classNameblock span classNamedemonstrationJump to/span Pagination layoutprev, pager, next, jumper total{1000} pageSize{100} currentPage{5}/ /div div classNameblock span classNamedemonstrationAll combined/span Pagination layouttotal, sizes, prev, pager, next, jumper total{400} pageSizes{[100, 200, 300, 400]} pageSize{100} currentPage{5}/ /div /div ) }下面逐个说明这三个模块在源码中的行为。total总条数文本Total是一个极轻量的展示组件Pagination.jsx L58-L64const Total props { return typeof props.total number ? span classNameel-pagination__total {locale.t(el.pagination.total, { total: props.total })} /span : span /; };只有total是数字时才会渲染文案否则输出空span/。文案本身走国际化例如英文包 src/locale/lang/en.js 中为Total {total}中文包 src/locale/lang/zh-CN.js 中为共 {total} 条——即total模块的显示文案随组件全局 locale 变化无需额外配置。sizes每页条数选择器Sizes组件Pagination.jsx L31-L56内部复用 Select 组件把pageSizes数组逐项渲染为选项{this.props.pageSizes.map((item, idx) { return ( Select.Option key{idx} value{item} label{item locale.t(el.pagination.pagesize)} / ); })}因此文档中pageSizes{[100, 200, 300, 400]}会得到100 /page、200 /page……四个下拉选项中文环境下为100 条/页。初始化时内部每页条数的取值逻辑在构造函数中Pagination.jsx L119-L127let internalPageSize 0; if (layout.split(,).indexOf(sizes) -1 Array.isArray(pageSizes)) { internalPageSize pageSizes.indexOf(pageSize) -1 ? pageSize : pageSizes[0]; } else { internalPageSize pageSize; }可以推断两条规则只有 layout 含sizes时才会校验pageSize是否属于pageSizes若不属于则静默回退为pageSizes[0]。这解释了为什么在Change page size示例中显式传入pageSize{1000}后实际生效的每页条数是pageSizes的第一项100该示例的意图是演示回退行为。jumper跳页输入框Jumper组件Pagination.jsx L66-L97渲染一个typenumber的输入框关键属性由组件内部计算min{1}、max{this.props.internalPageCount}——输入范围被限制在合法页码区间默认值显示当前页internalCurrentPage触发时机有两个onBlur失焦或按下回车e.keyCode 13。用户提交的页码最终汇入jumperToPage()L249-L264与pre()/next()走同一条校验 → setState → 比较旧值 → 回调事件的处理链。Attributes 属性表以下属性表完整继承自官方文档site/docs/en-US/pagination.md默认值与 Pagination.defaultProps 逐一核对一致AttributeDescriptionTypeAccepted ValuesDefaultsmallwhether to use small paginationboolean—falsepageSizeitem count of each pagenumber—10totaltotal item countnumber——pageCounttotal page count. Set eithertotalorpage-countand pages will be displayed; if you needpageSizes,totalis requirednumber——currentPagecurrent page numbernumber—1layoutlayout of Pagination, elements separated with a commastringsizes,prev,pager,next,jumper,-,total,slotprev, pager, next, jumper, -, totalpageSizesoptions of item count per pagenumber[]—[10, 20, 30, 40, 50, 100]两个需要留意的点total与pageCount二选一。页码总数的计算函数internalPageCount()Pagination.jsx L237-L247明确了优先级internalPageCount(): ?number { if (this.state) { if (typeof this.state.total number) { return Math.ceil(this.state.total / this.state.internalPageSize); } else if (typeof this.state.pageCount number) { return this.state.pageCount; } } return null; }total优先且页数由total / internalPageSize向上取整得到因此需要支持sizes动态切换每页条数时必须传total否则切换pageSize后无法重新推算页数。两者都未传时函数返回nullpager与jumper的max等依赖项都会按无有效页数处理。slot的实际情况。文档 Accepted Values 中列出了slot但从源码结构看当前版本的TEMPLATE_MAP只包含prev / jumper / pager / next / sizes / total六项slot在forEach中会 push 到undefinedReact 会忽略不渲染。使用slot语法时不会报错但也不会有可见输出属于文档预留而源码未落地的能力。Events 事件表Event NameDescriptionParametersonSizeChangetriggers whenpage-sizechangesthe newpage-sizeonCurrentChangetriggers whencurrent-pagechangesthe newcurrent-pageReact 版本采用驼峰事件属性与 Vue 版的size-change/current-change对应。从源码看两个事件都有去重保护onSizeChange仅在选中的值与内部internalPageSize不同才触发触发前还会把当前页用新页大小重新钳制一遍L281-L300onCurrentChangepre()、next()、jumperToPage()、handleCurrentChange()四条路径全部是先setState在回调里比较oldPage ! this.state.internalCurrentPage不同才调用onCurrentChange。也就是说点击当前页、或在第一页点上一页这类无效操作不会派发事件。事件签名可在 typings/index.d.ts 中确认interface PaginationProps extends ElementReactLibs.ComponentProps{} { pageSize?: number small?: boolean total?: number pageCount?: number currentPage?: number layout?: string pageSizes?: number[] onCurrentChange?(currentPage?: number): void onSizeChange?(size?: number): void }页码列表pager的裁剪算法当页数超过 7 时基础用法中total{1000}、pageSize10即 100 页的场景中间页码会被省略号替代。这一行为的实现全部在 src/pagination/Pager.jsx 中1. 窗口计算。getPages()以pagerCount 7为窗口宽度根据当前页位置决定省略号显示L67-L116if (pageCount pagerCount) { if (currentPage pagerCount - 2) { showPrevMore true; // 当前页靠后 → 头部出现 more } if (currentPage pageCount - 2) { showNextMore true; // 当前页靠前 → 尾部出现 more } }随后分四种情况生成中间页码靠后时从pageCount - 5开始补齐尾部靠前时固定显示第 2~6 页中间位置则以当前页为中心、offset Math.floor(pagerCount / 2) - 1为半径取连续 7 页。首尾页1与pageCount在render()中单独渲染L125-L180始终常驻。2. 省略号的快速跳转。more 标记不是纯装饰点击btn-quickprev/btn-quicknext会在当前页基础上快速前进或后退 5 页L44-L49if (target.className.indexOf(more) ! -1) { if (target.className.indexOf(quickprev) ! -1) { newPage currentPage - 5; } else if (target.className.indexOf(quicknext) ! -1) { newPage currentPage 5; } }且所有点击路径页码点击、快速跳转最终都经过同一处边界修正newPage 1归 1newPage pageCount归pageCount只有与当前页不同时才调用this.props.onChange(newPage)向上冒泡。悬停时省略号图标还会从el-icon-more切换为双箭头el-icon-d-arrow-left/right提示可点击L138-L143。当前页的钳制逻辑getValidCurrentPage所有页码变更入口——翻页按钮、点击页码、跳页输入框、外部 props 更新——最终都会经过getValidCurrentPage()Pagination.jsx L212-L235getValidCurrentPage(value: string | number): number { value parseInt(value, 10); let internalPageCount this.internalPageCount(); let resetValue; if (!internalPageCount) { if (isNaN(value) || value 1) resetValue 1; } else { if (value 1) { resetValue 1; } else if (value internalPageCount) { resetValue internalPageCount; } } if (resetValue undefined isNaN(value)) { resetValue 1; } else if (resetValue 0) { resetValue 1; } return resetValue undefined ? value : resetValue; }其语义可以概括为未配置有效页数时非法值一律落到第 1 页配置了页数时值被夹紧到[1, internalPageCount]区间。这带来两个实际影响外部受控更新currentPage时componentWillReceiveProps中检测到 props 变化后调用L139-L176若新值超出范围会被自动修正组件内部永远保持合法状态切换pageSize导致总页数缩小时例如每页 400 条改回 100 条时onSizeChange会主动对当前页做一次getValidCurrentPage重算避免停留在不存在的页码上。而prev/next按钮的禁用态则由两个内联组件直接判断Pre在internalCurrentPage 1时加disabledL9-L16Next在internalCurrentPage internalPageCount || internalPageCount 0时禁用L18-L29——注意0 页时下一页按钮也会被禁用避免空数据下的无效点击。典型集成模式把属性、事件与源码行为串起来一个受控的完整用法通常长这样import { Pagination } from element-react; class DataList extends Component { state { currentPage: 1, pageSize: 20, total: 0 }; handleCurrentChange (currentPage) { this.setState({ currentPage }, () this.fetchData()); }; handleSizeChange (size) { // 组件内部已按新 size 钳制过当前页 this.setState({ pageSize: size, currentPage: 1 }, () this.fetchData()); }; fetchData() { const { currentPage, pageSize } this.state; // 向服务端请求第 currentPage 页、每页 pageSize 条的数据 } render() { const { currentPage, pageSize, total } this.state; return ( Pagination layouttotal, sizes, prev, pager, next, jumper total{total} pageSizes{[10, 20, 30, 40]} pageSize{pageSize} currentPage{currentPage} onCurrentChange{this.handleCurrentChange} onSizeChange{this.handleSizeChange} / ); } }要点使用sizes时必须传total而非pageCount以便组件重算页数回调里拿到的是已经过钳制的合法值可直接用于发起请求。小结element-react 的 Pagination 组件以一条layout字符串为骨架把prev、pager、next、sizes、jumper、total六个子模块自由拼装配合small、pageSizes等属性覆盖大多数列表分页场景onCurrentChange/onSizeChange两个事件携带合法值驱动数据层。深入 src/pagination/Pagination.jsx 与 src/pagination/Pager.jsx 后可以确认页码窗口固定为 7、省略号支持 ±5 快速跳转、所有页码变更统一经过getValidCurrentPage()钳制、total的优先级高于pageCount、事件均带值未变化不触发的保护。这些行为边界在自定义封装或排查分页异常时尤其有价值。相关参考文件文档site/docs/en-US/pagination.md中文版见 site/docs/zh-CN/pagination.md实现src/pagination/Pagination.jsx、src/pagination/Pager.jsx类型typings/index.d.ts文案src/locale/lang/zh-CN.js、src/locale/lang/en.js赞分享前端UI组件设计系统【免费下载链接】element-reactElement UI项目地址https://gitcode.com/gh_mirrors/el/element-react点击查看免费下载相关推荐用 MAS 激活 Windows 和 Office四种方式怎么选、三种跑法怎么做用 MAS 激活 Windows 和 Office四种方式怎么选、三种跑法怎么做 重装完系统桌面右下角又出现激活 Windows的水印打开 Word操作系统Mac Mouse Fix 完整指南把普通鼠标变成 Mac 上最顺手的输入设备Mac Mouse Fix 完整指南把普通鼠标变成 Mac 上最顺手的输入设备 花二十块买来的鼠标接上 Mac滚轮方向反直觉侧键点了没反应指针还快得没脾桌面应用系统编程rsuite Pagination 高级定制用 layout 属性自由编排分页组件布局rsuite Pagination 高级定制用 layout 属性自由编排分页组件布局 分页Pagination组件用于辅助长列表分批加载数据、让用户快速前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

微信小程序日期时间格式化工具封装与iOS NaN兼容方案

微信小程序日期时间格式化工具封装与iOS NaN兼容方案

微信小程序开发中,日期时间格式化几乎是每个项目逃不开的环节。不管是列表页展示“刚刚 / 5分钟前”,还是订单详情需要“2024-05-20 14:30:00”这种标准格式,都得跟日期字符串打交道。我在实际开发中发现,很多初学者直接拿原生Dat…

2026/10/14 15:58:04 阅读更多 →
MySQL索引失效真相与B+树底层原理实战

MySQL索引失效真相与B+树底层原理实战

1. 这不是背题清单,而是索引原理的实战解剖台“MySQL索引相关面试题”——看到这九个字,很多人的第一反应是翻面经、刷八股、默写B树结构图。但我在带过二十多届后端实习生、参与过三十多个中大型系统数据库方案评审后发现:真正卡住工程师的&…

2026/10/14 15:57:02 阅读更多 →
智叟云集系统如何服务品牌团队与GEO服务商

智叟云集系统如何服务品牌团队与GEO服务商

智叟云集系统如何服务品牌团队与GEO服务商关键词 智叟云集系统,GEO服务,AI品牌可见度,品牌内容运营,搜索优化智叟云集系统技术系列 | 2026年10月智叟云集系统面向两类使用者:希望直接开展 AI 品牌监测的企业团队&am…

2026/10/14 15:57:02 阅读更多 →

最新新闻

AI Agent状态清理:超时重试背后的系统性风险与四维治理

AI Agent状态清理:超时重试背后的系统性风险与四维治理

1. 这不是超时和重试的问题,是状态管理的系统性溃败“给 AI Agent 加超时和重试后,我才发现真正的坑在状态清理”——这句话刚在内部技术群刷出来时,我正盯着一个跑了37分钟、卡在waiting_for_tool_execution状态、内存占用飙升到4.2GB却毫无…

2026/10/14 16:41:53 阅读更多 →
嵌入式Qt记事本开发全链路:从交叉编译到中文文件IO

嵌入式Qt记事本开发全链路:从交叉编译到中文文件IO

简介:这是一份基于Qt6开发的跨平台记事本项目源码,面向嵌入式与桌面应用开发初学者及Qt进阶学习者,聚焦GUI界面构建、文件编码处理与轻量级文本编辑功能实现。项目完整呈现了现代C在Qt框架下的典型工程实践,涵盖主窗口&#xff08…

2026/10/14 16:41:53 阅读更多 →
计算机系统概论第一章答案精讲:ISA、微架构与算法性质

计算机系统概论第一章答案精讲:ISA、微架构与算法性质

简介:计算机系统概论(原书第二版)第一章习题答案以PDF形式提供,面向计算机专业学生、考研读者和自学入门者,用于对照教材习题检验对计算机系统基础概念的掌握。内容选自原书附录的精选解答,覆盖冯诺依曼通用…

2026/10/14 16:41:53 阅读更多 →
远视储备与近视防控:从原理到实操的家长指南

远视储备与近视防控:从原理到实操的家长指南

1. 远视储备不是“储备”,而是一笔会不断消耗的视力存款1. 远视储备不是“储备”,而是一笔会不断消耗的视力存款1.1 远视储备到底是什么很多家长第一次听到“远视储备”这个词,是在幼儿园体检或者眼科门诊的报告单上。医生指着上面的数字说&a…

2026/10/14 16:41:53 阅读更多 →
Python数据挖掘实战:K均值聚类从原理到应用

Python数据挖掘实战:K均值聚类从原理到应用

1. 从一个真实需求说起:为什么K均值聚类值得你花时间搞懂做数据挖掘这些年,我越来越觉得,K均值聚类是那种“看起来简单、用起来真香、但踩坑也真不少”的算法。很多刚入门的朋友一听到“无监督学习”四个字就头大,觉得没有标签怎么…

2026/10/14 16:41:53 阅读更多 →
MinGW-w64离线安装包:断网Windows下C/C++工具链部署指南

MinGW-w64离线安装包:断网Windows下C/C++工具链部署指南

简介:MinGW-w64是为64位Windows系统打造的GCC工具链离线安装包,面向需要在Windows环境下学习或开展C语言开发的程序员。压缩包约2000个文件、133.98MB,主要由h头文件、Python脚本、a静态库、pyc编译文件、exe可执行程序、dll动态库及少量c源文…

2026/10/14 16:40:52 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →