From 07a5275a7ab59401b8f8fca3b8bc420dad2ef515 Mon Sep 17 00:00:00 2001 From: HIsheR Date: Mon, 26 Oct 2026 22:22:37 +0800 Subject: [PATCH] =?UTF-8?q?iter(g260):=20=E8=A1=A5=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E8=81=94=E5=8A=A8=E9=85=8D=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llms-full.txt | 25 +++++++++++++++++++++++++ llms.txt | 1 + packages/tools/cli/recipes.md | 25 +++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/llms-full.txt b/llms-full.txt index d631686..8538fb8 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -2823,6 +2823,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`),组件只读写信号,不持有业务数据副本。 diff --git a/llms.txt b/llms.txt index 9199220..72fb347 100644 --- a/llms.txt +++ b/llms.txt @@ -172,3 +172,4 @@ - 配方 12:命令面板(⌘K 全局操作入口)(6 条要点) - 配方 13:预约时点(日期 + 时间两段拼装)(5 条要点) - 配方 14:标签筛选条 → 表格联动(5 条要点) +- 配方 15:表格分页与独立分页器联动(每页条数 + 受控页码)(4 条要点) diff --git a/packages/tools/cli/recipes.md b/packages/tools/cli/recipes.md index df2bed6..5b9fbc6 100644 --- a/packages/tools/cli/recipes.md +++ b/packages/tools/cli/recipes.md @@ -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`),组件只读写信号,不持有业务数据副本。