Element UI(Vue 2.0)Pagination 分页组件完全指南:布局、事件与源码实现剖析
Element UIVue 2.0Pagination 分页组件完全指南布局、事件与源码实现剖析【免费下载链接】elementA Vue.js 2.0 UI Toolkit for Web项目地址: https://gitcode.com/gh_mirrors/eleme/element当单页需要展示的数据量过大时使用分页Pagination将数据拆解到多页是最常见的交互方案。本文以 Element UIVue 2.0 UI Toolkit官方文档 examples/docs/es/pagination.md 为主体系统讲解el-pagination的布局体系、页码折叠机制、每页条数切换、跳页输入、事件回调与自定义插槽并结合仓库内 组件源码 与 单元测试 深入剖析其底层实现。读完本文你将能够根据业务场景自由组合分页模块、正确使用page-size/current-page的.sync双向绑定并理解页码折叠与事件去重的内部原理。基础用法用layout声明分页元素el-pagination的核心设计是可组合布局通过layout属性用逗号分隔的方式声明需要显示哪些分页元素布局元素会按书写顺序依次渲染。分页元素包括元素含义prev上一页按钮next下一页按钮pager页码列表jumper跳页输入框输入页码后按回车跳转total总条目数sizes每页条数下拉选择器select-特殊布局符号位于其后的所有元素将被推到右侧显示div classblock span classdemonstration页数较少时的效果/span el-pagination layoutprev, pager, next :total50 /el-pagination /div div classblock span classdemonstration大于 7 页时的效果/span el-pagination layoutprev, pager, next :total1000 /el-pagination /div从源码看layout的解析在 pagination.js 的render函数中完成layout.split(,)后将每个元素trim再通过TEMPLATE_MAP映射到对应的子组件当遇到-时其后的组件被放入el-pagination__rightwrapper右浮动容器中从而实现靠右显示的效果。默认layout为prev, pager, next, jumper, -, totalpagination.js即默认展示上一页、页码、下一页、跳页输入框以及靠右的总条数。设置最大页码按钮数pager-count默认情况下当总页数超过 7 页时Pagination 会折叠多余的页码按钮只在首尾保留页码中间用省略号...代替。通过pager-count属性可以自定义这一阈值el-pagination :page-size20 :pager-count11 layoutprev, pager, next :total1000 /el-pagination在源码中pager-count是一个带校验器的 proppagination.jspagerCount: { type: Number, validator(value) { return (value | 0) value value 4 value 22 (value % 2) 1; }, default: 7 }也就是说pager-count必须是大于等于 5 且小于等于 21 的奇数默认值为 7。这一约束保证了折叠算法的对称性在 pager.vue 的pagers计算属性中halfPagerCount (pagerCount - 1) / 2再结合当前页currentPage与总页数pageCount判断是否显示左省略号showPrevMore或右省略号showNextMore当currentPage pagerCount - halfPagerCount时显示左侧省略号当currentPage pageCount - halfPagerCount时显示右侧省略号若两侧都省略则中间显示以当前页为中心的连续页码区间。点击省略号本身还可以快速向前/向后翻动pagerCount - 2页见 pager.vue 的onPagerClick与btn-quickprev/btn-quicknext逻辑鼠标悬停时省略号会变为双向箭头图标。小型分页small在空间有限的场景如表格工具栏、弹窗底部下可以启用小型分页样式。只需要一个small属性它接受Boolean默认为false设为true即可el-pagination small layoutprev, pager, next :total50 /el-pagination从源码看small与background一样会反映在根元素的 class 上pagination.jslet template div class{[el-pagination, { is-background: this.background, el-pagination--small: this.small }] }/div;对应的紧凑样式按钮高度 22px、字号 12px 等定义在主题样式文件 packages/theme-chalk/src/pagination.scss 的m(small)修饰类中。为分页按钮添加背景色background虽然西语文档正文未单列此小节但中文版与英文版文档examples/docs/zh-CN/pagination.md、examples/docs/en-US/pagination.md以及源码中均已支持设置background属性可以为分页按钮添加背景色el-pagination background layoutprev, pager, next :total1000 /el-pagination该属性在源码 props 中定义为background: Booleanpagination.js默认false启用后根元素会增加is-background类按钮背景色样式由 pagination.scss 提供。附加功能组合完整的业务分页根据实际场景可以自由叠加多个功能模块。下面的完整用例使用了size-change与current-change事件来处理每页条数和当前页变化时的回调page-sizes接受一个整型数组数组元素即为下拉选择器中可选的每页条数例如[100, 200, 300, 400]表示四个选项每页显示 100、200、300 或 400 条。template div classblock span classdemonstration显示总数/span el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-page.synccurrentPage1 :page-size100 layouttotal, prev, pager, next :total1000 /el-pagination /div div classblock span classdemonstration调整每页显示条数/span el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-page.synccurrentPage2 :page-sizes[100, 200, 300, 400] :page-size100 layoutsizes, prev, pager, next :total1000 /el-pagination /div div classblock span classdemonstration直接前往/span el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-page.synccurrentPage3 :page-size100 layoutprev, pager, next, jumper :total1000 /el-pagination /div div classblock span classdemonstration完整功能/span el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-page.synccurrentPage4 :page-sizes[100, 200, 300, 400] :page-size100 layouttotal, sizes, prev, pager, next, jumper :total400 /el-pagination /div /template script export default { methods: { handleSizeChange(val) { console.log(每页 ${val} 条); }, handleCurrentChange(val) { console.log(当前页: ${val}); } }, data() { return { currentPage1: 5, currentPage2: 5, currentPage3: 5, currentPage4: 4 }; } } /script该用例覆盖了total总条数展示、sizes每页条数选择器、jumper跳页输入框三种附加模块。几个值得注意的要点current-page与page-size均支持.sync修饰符组件内部通过$emit(update:currentPage, newVal)与$emit(update:pageSize, val)同步回父组件见 pagination.js因此外部数据源始终与组件内部状态保持一致。page-sizes默认值为[10, 20, 30, 40, 50, 100]pagination.js。当page-size不在page-sizes列表中时sizes子组件会回退选中列表第一个值pagination.js这一点在 单元测试 的pageSizes:not found pageSize用例中得到了验证。sizes与jumper内部复用了 Element 的el-select与el-input组件pagination.js所以popper-class属性可以自定义每页条数下拉框的类名。jumper输入框的范围被限制在[1, internalPageCount]之间非法输入小于 1、大于总页数、非数字会被getValidCurrentPage自动修正pagination.js测试用例 pagination.spec.js 与 pagination.spec.js 验证了输入 0、1000 或非数字时均会回退到合法页码。当只有一页时隐藏分页hide-on-single-page当数据只有一页时分页组件往往没有展示价值。通过设置hide-on-single-page属性Pagination 会在总页数为 1或未提供total/page-count时直接渲染为空注释节点div el-switch v-modelvalue /el-switch el-pagination :hide-on-single-pagevalue :total5 layoutprev, pager, next /el-pagination /div script export default { data() { return { value: false } } } /script源码中的判断位于render函数开头pagination.jsif (this.hideOnSinglePage (!this.internalPageCount || this.internalPageCount 1)) return null;即当hideOnSinglePage为true且计算出的总页数为 0 或 1 时直接返回null。对应的单元测试 pagination.spec.js 断言此时vm.$el.nodeType为COMMENT_NODE确认组件被完全卸载。Attributes完整属性表参数说明类型可选值默认值small是否使用小型分页样式boolean—falsebackground是否为分页按钮添加背景色boolean—falsepage-size每页显示条目个数支持.sync修饰符number—10total总条目数number——page-count总页数total和page-count设置任意一个就可以达到显示页码的功能如果要支持page-sizes的更改则需要使用total属性Number——pager-count页码按钮的数量当总页数超过该值时会折叠number大于等于 5 且小于等于 21 的奇数7current-page当前页数支持.sync修饰符number—1layout组件布局子组件名用逗号分隔Stringsizes,prev,pager,next,jumper,-,total,slotprev, pager, next, jumper, -, totalpage-sizes每页显示个数选择器的选项设置number[]—[10, 20, 30, 40, 50, 100]popper-class每页显示个数选择器的下拉框类名string——prev-text替代图标显示的上一页文字string——next-text替代图标显示的下一页文字string——disabled是否禁用boolean—falsehide-on-single-page只有一页时是否隐藏boolean——关于total与page-count的关系源码在internalPageCount计算属性中做了明确处理pagination.js优先使用total通过Math.max(1, Math.ceil(total / internalPageSize))计算总页数否则使用pageCount。若两者都未提供总页数为null此时分页组件仅保留上一页/下一页的翻页能力而无法渲染页码列表。另外当total变化导致总页数小于当前页时组件会自动将当前页钳制到最大页数见 pagination.js 的internalPageCountwatcher。prev-text与next-text用于在需要纯文字而非图标时替换默认的左右箭头源码中Prev/Next子组件在提供了对应文字时渲染span否则渲染el-icon-arrow-left/el-icon-arrow-right图标pagination.js。同时prev按钮在第一页时、next按钮在最后一页时或总页数为 0 时会被自动置为disabled。Events事件回调事件名称说明回调参数size-changepageSize 改变时会触发每页条数current-changecurrentPage 改变时会触发当前页prev-click用户点击上一页按钮改变当前页后触发当前页next-click用户点击下一页按钮改变当前页后触发当前页事件触发逻辑位于 pagination.jsprev()/next()会先校验disabled计算新页码后分别$emit(prev-click, ...)/$emit(next-click, ...)再调用emitChange()emitChange()借助lastEmittedPage与userChangePageSize做事件去重只有当内部页码确实变化或用户主动修改了每页条数时才通过$nextTick发出current-changepagination.js。对应的测试用例 pagination.spec.js 验证了连续点击 9 次下一页再点上一页才会触发一次current-change以及手动将current-page改回原值不会重复触发。Slot自定义插槽name说明—自定义内容需要在layout中列出slotel-pagination支持默认插槽用于在分页条中插入自定义内容如刷新按钮、统计信息等。使用时必须在layout中声明slot元素源码在TEMPLATE_MAP中将其渲染为slotpagination.jsel-pagination layoutslot, prev, pager, next :page-size25 :total100 span classslot-test自定义内容/span /el-pagination对应的 单元测试 验证了自定义内容能够被正确渲染到分页条内。源码实现要点小结组件注册el-pagination通过 packages/pagination/index.js 以Pagination.install方式全局注册组件名为ElPagination。内部状态组件维护internalCurrentPage、internalPageSize两套内部变量与外部 propscurrentPage、pageSize通过 watcher 双向同步pagination.js任何非数字输入如NaN都会回退到默认值这一行为同样有测试覆盖pagination.spec.js。布局渲染全部子组件Prev、Next、Pager、Sizes、Jumper、Total、slot均在 pagination.js 内以渲染函数方式内联定义-之后的内容进入右浮动容器。页码折叠折叠算法集中在 pager.vue 的pagers计算属性与onPagerClick方法中通过省略号按钮实现批量翻页。综上Element UI 的 Pagination 组件以布局可组合、状态可同步、边界自动钳制为设计主线配合size-change、current-change、prev-click、next-click四个事件即可覆盖绝大多数列表分页需求若需要更多源码细节可继续阅读 组件源码、页码渲染实现 与 完整单元测试。【免费下载链接】elementA Vue.js 2.0 UI Toolkit for Web项目地址: https://gitcode.com/gh_mirrors/eleme/element创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI编程工具双雄对决:Cursor与OpenCode的搭配使用指南

AI编程工具双雄对决:Cursor与OpenCode的搭配使用指南

最近这两周,我身边的开发者几乎都在讨论同一个话题:AI编程工具到底选哪一个。有人吹Cursor,有人安利OpenCode,还有人把这两个名字放在一起当成了开源项目的组合。作为一个把大半工作流都迁到AI辅助编程上的老开发者,我…

2026/9/19 2:45:02 阅读更多 →
块存储、文件存储、对象存储选型与混合架构实战

块存储、文件存储、对象存储选型与混合架构实战

简介:本资源是一份面向IT运维工程师、系统架构师及高校计算机专业学生的主流存储技术入门与进阶教学课件,聚焦DAS、NAS、SAN三大存储架构的原理对比、适用场景与选型依据,并深入解析RAID 10/5/6数据保护机制、SSD与多类型硬盘(SAS…

2026/9/19 2:45:02 阅读更多 →
Copilot替代方案深度对比:TRAE、Cursor、Windsurf与通义灵码实战选型指南

Copilot替代方案深度对比:TRAE、Cursor、Windsurf与通义灵码实战选型指南

1. 这不是“换一个插件”那么简单:为什么开发者突然集体寻找 Copilot 替代品最近两周,我收到的咨询里有将近七成都在问同一个问题:“Copilot 用不了了,现在该用啥?”不是技术故障,不是账号异常,…

2026/9/19 2:45:02 阅读更多 →

最新新闻

深入 Mos:macOS 鼠标滚动平滑与独立方向控制的实现解析(README 全解读)

深入 Mos:macOS 鼠标滚动平滑与独立方向控制的实现解析(README 全解读)

桌面应用 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on macOS 项目地址: https://g…

2026/9/20 6:58:06 阅读更多 →
回溯算法实战:组合问题解析与LeetCode题解

回溯算法实战:组合问题解析与LeetCode题解

1. 回溯算法基础与组合问题实战回溯算法是解决组合问题的利器,它通过递归的方式系统地探索所有可能的解。今天我们就来深入剖析三道经典的组合问题:77.组合、216.组合总和III和17.电话号码的字母组合。1.1 回溯算法的核心思想回溯算法本质上是一种暴力搜…

2026/9/20 6:58:06 阅读更多 →
AI编程上下文切换太贵?用Git Worktree和状态文件实现多项目高效并行

AI编程上下文切换太贵?用Git Worktree和状态文件实现多项目高效并行

我电脑上常年挂着四五个项目,有的是自己的小工具,有的是帮朋友维护的业务系统,有的还是临时接的定制需求。我本身不是那种能把手头工作完全分给团队的人——人手不够,能指望的只有 AI 编程助手。但我用了一段时间发现一个尴尬的现…

2026/9/20 6:58:06 阅读更多 →
Flask+微信小程序构建企业产品推广系统实战

Flask+微信小程序构建企业产品推广系统实战

1. 项目概述这个基于Python Flask框架和微信小程序的"企业产品推广系统"是我去年为一家本地食品企业开发的实战项目。系统核心目标是帮助中小型企业以最低成本搭建移动端产品展示与推广平台,解决传统企业数字化转型中的三大痛点:开发成本高、运…

2026/9/20 6:58:06 阅读更多 →
接口测试实战指南:从HTTP协议到Apifox自动化与问题排查

接口测试实战指南:从HTTP协议到Apifox自动化与问题排查

接口测试做了这么多年,我一直觉得它是性价比最高的测试类型。一个系统可以没有UI自动化,可以没有单元测试,但接口测试几乎是每一家正经做软件的公司都绕不开的基本盘。为什么?因为所有业务逻辑最终都要落到服务端的数据交换上&…

2026/9/20 6:58:06 阅读更多 →
uni-app 中基于 UTS 封装 Worker 多线程:uts-worker 插件源码解析与实战

uni-app 中基于 UTS 封装 Worker 多线程:uts-worker 插件源码解析与实战

示例工程前端移动开发跨平台 【免费下载链接】uni-app A cross-platform framework using Vue.js 项目地址: https://gitcode.com/gh_mirrors/un/uni-app 点击查看 免费下载 导读 uts-worker 是当前 uni-app 开源仓库中自带的一个 UTS API 插件(位于 s…

2026/9/20 6:57:05 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →