跳转到内容

分页 pagination

导航组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

count 给的是总条数不是总页数;页码序列由 root 的插槽交出来,作者照着渲染 item 与省略号

受控与切片

传了 page 就由宿主说了算;插槽里的 slice 按当前页从整份数据里切出这一页

两侧页数

sibling-count 决定当前页两侧各留几页,序列长度恒定,切页时省略号左右挪、按钮不抖

读屏文案

translations 换掉 nav 地标名与各按钮的 aria-label,默认是英文

语气

tone 换的是当前页选中态的底色与文字色,这里预置第 3 页为当前页

brand(缺省)
neutral
success
warning
danger
info

尺寸

size 一档换掉页码格子的高度、内边距与字号,上一页 / 下一页与省略号一并跟着变

sm
缺省
lg

极简排布

页码序列不渲染也行,只留上一页 / 下一页与一行位置回显;先后顺序归作者

快速跳页

输入框按 Enter 调插槽给的 setPage;越界页码由它夹回合法区间

每页条数

pageSize 归宿主持有;换档后总页数重算,越界的当前页被夹回末页

每页条数

整组禁用

分页自己没有禁用开关:裹一层 disabled 的 fieldset,里面的按钮统一失效并脱出 Tab 序

数据加载中,整组分页不可操作

产物

自定义元素<xh-pagination>
Vue 组件XhPaginationEllipsis XhPaginationItem XhPaginationNextTrigger XhPaginationPrevTrigger XhPaginationRoot
组合式函数usePagination
状态机paginationMachine
皮肤@xihan-ui/styles/pagination.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="pagination"root · prev-trigger · next-trigger · item · ellipsis

Props

属性类型必填说明
countnumber总条数(不是总页数)。总页数由它与 pageSize 算出。
pageSizenumber每页条数,默认 10;小于 1 的值一律按 1 处理。
pagenumber当前页。给定即受控:内部不再自改,只发 onPageChange。
defaultPagenumber非受控初始页,默认 1。
siblingCountnumber当前页两侧各显示几页,默认 1。
dirDirection文字方向,只作用于排版;上一页/下一页的语义不随之翻转,"上一页"永远是 page - 1。
translationsPartial<PaginationTranslations>
toneTone语气:brand / neutral / success / warning / danger / info,决定用哪族颜色。
sizeSize尺寸:sm / md / lg。
onPageChange(details: PaginationPageChangeDetails) => void页码变化意图回调;受控时是唯一出口,非受控随内部写入一并通知。

状态机

状态idle

事件PAGE.SET · PAGE.PREV · PAGE.NEXT

connect API

usePagination 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
pagenumber当前页,恒在 [1, max(totalPages, 1)] 内。
pageSizenumber
countnumber
totalPagesnumber
pagesPaginationPage[]页码序列,作者照着渲染 item 与 ellipsis。
pageRangePaginationEntryRange当前页对应的条目区间,1 基闭区间;无数据时是 { start: 0, end: 0 }。
previousPagenumber | null上一页页码;已在首页(或无数据)时为 null。
nextPagenumber | null
setPage(page: number) => void页码会被夹进合法区间,越界入参不会写出越界的页。
goToPrevPage() => void
goToNextPage() => void
slice<V>(data: readonly V[]) => V[]按当前页从整份数据里切出这一页。
getRootProps() => T['element']
getPrevTriggerProps() => T['button']
getNextTriggerProps() => T['button']
getItemProps(props: PaginationItemProps) => T['button']
getEllipsisProps() => T['element']

键盘

规格出处:W3C APG

按键生效条件行为
Enter / Spacefocus in item跳到该页码(原生按钮激活,平台把按键翻成 click)
Enter / Spacefocus in prev-trigger, 非首页回上一页;首页时按钮是原生 disabled,焦点根本落不上去
Enter / Spacefocus in next-trigger, 非末页进下一页;末页时按钮是原生 disabled
Tab / Shift+Tabfocus in root逐个走过每个可用按钮——分页不做 roving tabindex,用户要能 Tab 到某一页再确认;禁用的首尾按钮自动脱序

Released under The MIT License