iter(g170): 分页器支持极简模式与单页隐藏

This commit is contained in:
HIsheR
2026-10-26 16:17:05 +08:00
parent 8c9541d209
commit a754bd6b25
7 changed files with 60 additions and 5 deletions
+9 -1
View File
@@ -16,7 +16,7 @@ function pageSequence(page: number, totalPages: number): (number | null)[] {
return seq;
}
/*** 独立分页器:受控组件,page 为双向绑定信号;页码过多折叠省略号,首末页禁用翻页,jumpable 可跳页,pageSizes 可切每页条数 ***/
/*** 独立分页器:受控组件,page 为双向绑定信号;页码过多折叠省略号,首末页禁用翻页,jumpable 可跳页,pageSizes 可切每页条数,simple 走极简、hideOnSinglePage 单页隐藏 ***/
export function pagination(props: PaginationProps): HTMLElement {
// —— 状态集中声明 ——
@@ -61,6 +61,14 @@ export function pagination(props: PaginationProps): HTMLElement {
renderList(pages, () => {
const totalNow = totalPages();
const page = Math.min(totalNow, Math.max(1, props.page()));
nav.hidden = Boolean(props.hideOnSinglePage) && totalNow <= 1; // 单页时整块隐藏,工具栏不必为它留位
if (props.simple) { // 极简态:页码不给点,只留前后翻页与进度文字
return [
h('button', { class: 'ua-page-btn', disabled: page <= 1, 'aria-label': '上一页', onClick: () => go(page - 1) }, '‹'),
h('span', { class: 'ua-page-simple', 'aria-live': 'polite' }, `${page} / ${totalNow}`),
h('button', { class: 'ua-page-btn', disabled: page >= totalNow, 'aria-label': '下一页', onClick: () => go(page + 1) }, '›'),
];
}
const items: HTMLElement[] = [h('button', { class: 'ua-page-btn', disabled: page <= 1, 'aria-label': '上一页', onClick: () => go(page - 1) }, '‹')];
for (const it of pageSequence(page, totalNow)) {
items.push(
+2
View File
@@ -314,6 +314,8 @@ export interface PaginationProps {
total: number; // 总条数
jumpable?: boolean; // 开启后在末尾显示跳页输入框(总页数 > 1 才出现)
pageSizes?: number[]; // 每页条数候选(如 [10, 20, 50]);传了才渲染条数切换器
simple?: boolean; // 极简模式:只留上一页 / 下一页与「当前 / 总页」文字,适合工具栏窄位;缺省 false
hideOnSinglePage?: boolean; // 只有一页时整个分页器隐藏;缺省 false
onPageSizeChange?: (size: number) => void; // 切换每页条数回调(同时自动回到第 1 页)
onChange?: (page: number) => void; // 翻页回调
}
+14 -1
View File
@@ -1531,6 +1531,18 @@
"r": 1,
"d": "总条数"
},
{
"n": "simple",
"t": "boolean",
"df": "false",
"d": "极简模式:只留上一页 / 下一页与「当前 / 总页」文字,适合表格工具栏等窄位"
},
{
"n": "hideOnSinglePage",
"t": "boolean",
"df": "false",
"d": "只有一页时整个分页器隐藏(不占布局位)"
},
{
"n": "onChange",
"t": "(page: number) => void",
@@ -1562,7 +1574,8 @@
"首末页自动禁用 ‹ › 翻页按钮,当前页禁点并标记 aria-current",
"与 dataTable 联动:把同一个 page 信号传给 dataTable 的 page 参数,两处翻页自动同步",
"键盘可达:全部是原生 button,Tab 聚焦后 Enter / Space 触发",
"pageSizes 传候选数组即出现「N 条/页」切换器,切换后自动回第 1 页;onPageSizeChange 拿新条数重算数据"
"pageSizes 传候选数组即出现「N 条/页」切换器,切换后自动回第 1 页;onPageSizeChange 拿新条数重算数据",
"空间紧的地方传 simple:页码区换成「3 / 5」文字 + 两个箭头(文字带 aria-live,翻页会被读屏播报);数据少到只有一页时再传 hideOnSinglePage,整块自动消失而不是留个灰掉的 1"
]
},
{
+7
View File
@@ -1289,6 +1289,13 @@ button.ua-step-dot:hover {
color: var(--ua-color-text-muted);
font-size: var(--ua-font-size-sm);
}
.ua-page-simple {
padding: 0 var(--ua-space-2);
color: var(--ua-color-text-muted);
font-size: var(--ua-font-size-sm);
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.ua-page-jump {
width: 48px;
padding: 4px 6px;