iter(g260): 补表格分页联动配方

This commit is contained in:
HIsheR
2026-10-26 22:22:37 +08:00
parent 79cc55270e
commit 07a5275a7a
3 changed files with 51 additions and 0 deletions
+25
View File
@@ -327,6 +327,31 @@ const table = dataTable({ data: matched, columns, pageSize: 10 }); // 信号数
- **「且」还是「或」写在派生里**:`every` 是且(收窄)、`some` 是或(放大),两种语义只差一个方法调用,但决定了空条件时的行为——空数组 `every` 恒为真(等于不限),`some` 恒为假(等于无结果),重置逻辑据此写。
- 结果为空时不要另写空状态:`dataTable` 已内置空行提示,筛选无命中会自己显示「没有匹配的行」。
## 配方 15:表格分页与独立分页器联动(每页条数 + 受控页码)
表格自带的分页条(上一页 / 页码播报 / 下一页 / 每页条数)只够单表自用;需要把页码提到页面上方、或让多个表格共用一个分页器时,用 `page` 信号把两边的页码接起来,条数候选交给 `pageSizes`。
```ts
const page = signal(1); // 唯一页码来源:表格与独立分页器共读共写
const size = signal(10); // 每页条数由业务决定,表格只负责渲染
const table = dataTable({
data: rows, // 数组或信号均可;换源保留排序、页码与选中态
columns,
page, // 受控页码:内部翻页实时写回,外部置值即跳页
pageSize: size(),
pageSizes: [10, 25, 50], // 分页条候选档;当前值不在候选里会自动补进去
selectable: true,
});
pagination({ page, total: () => rows().length, pageSize: size() }); // 独立分页器与表格共用同一页码信号
```
要点:
- **一个页码只有一个来源**:`page` 信号既是表格的内部页码,也是独立分页器的输入;两边各自派发、等值写回短路,不会互相推着翻页。
- **改页大小要回到第 1 页**:`pageSize` 变化时表格内部按内核语义回第 1 页,外部只需把 `size` 改掉,别在业务层再手动 `page(1)`(顺序错了会出现「先跳到 25 条的第 3 页再被推回第 1 页」的闪动)。
- **越界页码由内核收敛**:数据缩水后 `state` 里的页码会被回写成实际生效页,数据恢复也不会突然跳回旧页码——所以外部依赖这个信号做联动时不需要自己钳制。
- **每页条数下拉要给名字**:无可见 label 的场合(分页条、工具栏)传 `ariaLabel`,否则读屏只念出一句「10 条/页」而没有主语。
## 通用约定
- 状态一律放信号(`signal` / `computed`),组件只读写信号,不持有业务数据副本。