Pagination 分页
import { Pagination } from '@apollo-design/ui';采用分页的形式分隔长列表,每次只加载一个页面。
何时使用
- 当加载/渲染所有数据将花费很多时间时;
- 当数据量太大、需要分屏展示时;
- 需要让用户快速在页之间跳转时。
引入
import { Pagination } from '@apollo-design/ui';
代码演示
基本 #
最简单的用法:v-model:current 绑定当前页。
总数 #
通过 #total="{ total, range }" 展示总数与当前范围。
组合 #
尺寸切换器、快速跳转和原生总数槽组合。
改变页码大小 #
showSizeChanger 切换每页条数;禁用态一并展示;@show-size-change 拿到旧页与新页大小。
受控 #
v-model:current 受控;change 事件与普通用法一致。
简洁 #
simple 简化模式:只有上一页/下一页 + 当前 / 总数(可输入)。
跳转 #
showQuickJumper 快速跳转;{ goButton: true } 加一个确认按钮。
小尺寸 #
size="small" 小尺寸;responsive 会在 xs 断点自动变紧凑。
更多 #
showLessItems 每页显示更少的页码(±3 而不是 ±5)。
对齐 #
align 控制整体对齐(start / center / end)。
自定义页码 #
#itemRender="{ page, type, element }" 自定义每一项;空槽压住默认内容。
自定义切换器 #
通过原生 #sizeChanger 将尺寸切换器替换为 InputNumber,业务动作使用 onSizeChange。
组件 Token #
通过 ConfigProvider 的 theme.components.Pagination 自定义页码尺寸、背景色与激活态颜色;尺寸数值按 px 处理。
组件覆盖替换或移除后会重新读取当前全局 Token;根元素的原生 style 仍可覆盖对应 CSS 变量。
点击页码或切换每页条数可以看到状态变化。
语义化样式 #
通过 classNames 与 styles 自定义分页器根节点与每个页码项的样式。
页码悬浮时会轻微上移,点击可以切换当前页。
动态原生插槽 #
使用单个具名对象定义页码、总数和尺寸切换器。条件插槽可在挂载后出现或移除,空内容压住默认页码;根原生 attrs、事件和字符串样式按 Vue 规则更新。
Render pages, totals and size controls through named slot objects. Add or remove slots after mount; empty content suppresses default pages. Native root attrs, events and string styles update through Vue.
API
Pagination
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
current(v-model:current) |
当前页 | number |
—— |
| defaultCurrent | 非受控初始页 | number |
1 |
pageSize(v-model:pageSize) |
每页条数 | number |
—— |
| defaultPageSize | 非受控初始每页条数 | number |
10 |
| total | 数据总数 | number |
0 |
| pageSizeOptions | 每页条数可选项(⚠️ 只收数字) | number[] |
[10, 20, 50, 100] |
| totalBoundaryShowSizeChanger | 尺寸切换器的显示阈值 | number |
50 |
| showSizeChanger | 尺寸切换器:true / false / Select 的 props 对象 |
boolean | SelectProps |
total > 50 |
| showQuickJumper | 快速跳转;{ goButton } 可自定义确认按钮 |
boolean | { goButton?: VNodeChild } |
false |
| showPrevNextJumpers | 是否显示跳页项 | boolean |
true |
| showLessItems | 每页显示更少的页码(buffer 2→1、跳页步长 5→3) | boolean |
false |
| showTitle | 是否给 li 加 title |
boolean |
true |
| simple | 简化模式;{ readOnly: true } 时页码不可输入 |
boolean | { readOnly?: boolean } |
false |
| hideOnSinglePage | 只有一页时隐藏 | boolean |
false |
| disabled | 禁用 | boolean |
false |
| size | 尺寸 | 'small' | 'default' | 'large' |
—— |
| responsive | xs 断点且未指定 size 时用 small |
boolean |
false |
| align | 整体对齐 | 'start' | 'center' | 'end' |
—— |
| locale | 覆盖语言包(与 ConfigProvider 的 Pagination 分片合并,props 优先) |
PaginationLocale |
—— |
| role | 根 <ul> 的 role |
string |
—— |
| classNames | 语义化类名:root / item |
PaginationSemanticClassNames |
—— |
| styles | 语义化样式:同上 2 槽 | PaginationSemanticStyles |
—— |
事件
| 事件 | 说明 | 参数 |
|---|---|---|
update:current |
当前页变化(v-model:current) |
(current: number) |
update:pageSize |
每页条数变化(v-model:pageSize) |
(pageSize: number) |
change |
页码或每页条数变化(与 update:* 同时发出) |
(current: number, pageSize: number) |
showSizeChange |
仅每页条数变化时(⚠️ current 是变化前的页) |
(current: number, size: number) |
插槽
| 插槽 | 说明 | 参数 |
|---|---|---|
itemRender |
自定义每一项(替代 itemRender prop) |
{ page, type, element } |
total |
自定义总数展示(替代 showTotal prop) |
{ total, range } |
sizeChanger |
自定义尺寸切换器(替代 sizeChangerRender / antd 的 components.sizeChanger) |
{ value, onSizeChange, onChange, disabled, className, options, 'aria-label' } |
键盘
| 按键 | 行为 |
|---|---|
| Enter | 在页码 / 上一页 / 下一页 / 跳页项上触发 |
| Enter(快速跳转输入框) | 跳到输入页;↑ / ↓ 在简化模式下是 ∓1 |
current 与 pageSize 分别受控。defaultCurrent / defaultPageSize 只初始化非受控状态;外部赋值不发事件,移除控制后延续最后接收的值,不采纳被拒绝的更新请求。非受控当前页在总量收缩时保存钳制结果,随后总量回涨不会恢复旧页;受控当前页始终以传入值为准。尺寸切换仍按 update:pageSize → showSizeChange → update:current → change 的顺序通知,showSizeChange 的页码为切换前值。
简化输入在 Enter / 失焦后显示实际模型值,空输入恢复当前页。快速跳转失焦到本实例页码控件(含自定义槽中的按钮)时由该控件处理;移到其他分页实例仍正常提交。goButton 支持包含 0 的 Vue 内容,true 使用默认按钮,false / null / undefined 不显示确认内容。现代 KeyboardEvent.key 可用于 Enter 和方向键;槽内已取消的 Enter 不再由分页激活。禁用与零总量的占位项不参与 Tab 顺序并标记 aria-disabled,禁用时尺寸槽回调也不触发更新;尺寸必须为正整数且不同于当前值。
showSizeChanger 的 Select 配置使用原生 class,支持字符串、数组和对象;旧测试中的 showSizeChanger.className 写法改为 showSizeChanger.class,不保留该未声明别名。classNames.item / styles.item 继续控制分页项。没有公开 expose 方法,组件实例的 $el 指向当前根 <ul>(隐藏时为注释节点)。
⚠️ 尺寸切换器注入点有两个字段名:rc 的
sizeChangerRender实参叫onSizeChange, antd 的components.sizeChanger叫onChange—— 本仓两个都给(同一个函数), 照哪份文档写都能用(见COMPATIBILITY.md的 U14 上下文)。
设计 Token
| Token | 默认值(light) | 说明 |
|---|---|---|
itemBg / itemActiveBg / itemLinkBg / itemInputBg |
#ffffff |
页码 / 激活 / 常规上一页下一页按钮 / 简化输入背景 |
itemSize / itemSizeSM / itemSizeLG |
32px / 24px / 40px |
页码尺寸(controlHeight 三档) |
itemActiveColor / itemActiveColorHover |
#1677ff / #4096ff |
激活态文字色 / hover |
itemActiveColorDisabled |
rgba(0,0,0,0.25) |
激活态禁用文字色 |
itemActiveBgDisabled |
rgba(0,0,0,0.15) |
激活态禁用背景 |
miniOptionsSizeChangerTop |
0px |
mini 形态下切换器上边距 |
ConfigProvider 的 theme.components.Pagination 支持以上 12 个组件 Token;尺寸可用 CSS 字符串或数值(按 px),miniOptionsSizeChangerTop 可为负偏移。覆盖支持替换与移除,移除后从当前全局 Token 重新派生。根原生 style 优先于语义 root 样式,再优先于主题变量。自定义 prefixCls 对应同名前缀的组件变量,仍需调用方提供对应前缀样式。
快速跳转输入的字号、内边距、焦点等由当前全局 Token 派生,不是额外的 Pagination 组件覆盖字段;尺寸选择器本体使用 Select 的 Token。未启用源码主题时,组件保留静态 CSS 与祖先 CSS 变量的控制权。主题更新只写根 CSS 变量,样式规则保持静态。
原生 #itemRender / #total / #sizeChanger 是内容入口,三个渲染函数 prop 已直接移除,无兼容层或弃用期。页码槽覆盖 page/prev/next/jump-prev/jump-next;存在的空槽压住默认内容。插槽支持挂载后的条件出现、移除与响应式更新。PaginationItemSlotProps / PaginationTotalSlotProps / PaginationSlots 导出精确类型。根 id、title、原生事件及字符串/对象/数组 style 按 Vue 规则透传,与语义 root 样式合并。