From b39964011cfb1b9a546b0a8e499256966dde37e7 Mon Sep 17 00:00:00 2001 From: HIsheR Date: Mon, 26 Oct 2026 14:52:17 +0800 Subject: [PATCH] =?UTF-8?q?iter(g128):=20=E6=94=B6=E5=B0=BE=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E5=8F=98=E6=9B=B4=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .ua/backlog.json | 8 ++++++++ CHANGELOG.md | 10 ++++++++++ llms-full.txt | 29 +++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/.ua/backlog.json b/.ua/backlog.json index 781145e..ee441bf 100644 --- a/.ua/backlog.json +++ b/.ua/backlog.json @@ -1380,6 +1380,14 @@ "acceptance": "recipes.md 新增「配方 6:长表单编辑页(吸底操作条 + 提交锁定)」:affix position bottom 固定操作条、form 聚合校验与汇总条、同一 saving 信号锁按钮/开关/请求出口、maxCount 与 rules max 同源约束;npm run docs 后 llms-full.txt 出现该配方;npm run check 全绿", "notes": "自补:文档完善;只写用法不碰实现,配方随 docs 注入 llms-full", "status": "done" + }, + { + "id": "g128", + "title": "收尾刷新变更日志", + "motivation": "g123 之后又落了 10 次提交(rate 半星、checkbox 半选、开关 loading、precision、配方 6 等),changelog:check 已报漂移", + "acceptance": "npm run changelog 重新生成(329 提交),changelog:check 一致(提交本条后按约定再差一条,属正常);npm run check 全绿", + "notes": "自补:发版前刷新步骤;本次唤起收尾轮,顺带提交 g127 漏带的 llms-full.txt", + "status": "open" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 15495bf..4e329ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ ## 迭代 +- `48b0f35` iter(g127): 补长表单编辑页组合配方 +- `023a2eb` iter(g126): 数字输入补 precision 小数位 +- `490c9fa` iter(g125): 开关补 loading 加载态 +- `63d3c91` iter(g124): 复选框补 indeterminate 半选态 +- `ba102e0` iter(g123): 收尾刷新变更日志 - `72c5d24` iter(g122): 评分组件支持 allowHalf 半星 - `151d901` iter(g121): textField 补 maxCount 字数统计 - `5a6c7a5` iter(g120): 补新增组件落点清单 @@ -148,6 +153,11 @@ ## 维护 +- `6a5e12b` chore(backlog): 记录 g127 完成 +- `fc58442` chore(backlog): 记录 g126 完成 +- `686b0f7` chore(backlog): 记录 g125 完成 +- `56e5d18` chore(backlog): 记录 g124 完成 +- `85731a2` chore(backlog): 记录 g123 完成 - `0338f21` chore(backlog): 记录 g122 完成 - `f4a5101` chore(backlog): 记录 g121 完成 - `3e1e4ea` chore(backlog): 记录 g120 完成 diff --git a/llms-full.txt b/llms-full.txt index dc9e77a..5199320 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -1972,6 +1972,35 @@ const pager = pagination({ page, pageSize: 5, total: rows.length, jumpable: true - 列宽拖拽只对 `width` 给数字的列生效(`'flex'` 列交给浏览器自适应);双击手柄回到声明宽度。 - 行选择一律按 rowKey 记账,筛选换掉可见行后已选仍在,批量操作前用已选计数确认。 +## 配方 6:长表单编辑页(吸底操作条 + 提交锁定) + +```ts +const saving = signal(false); +form( + { + onSubmit: (ok) => { + if (!ok) return; // 失败时汇总条已定位到第一处错误,无需自己数红框 + saving(true); + save().then(() => toast.success('已保存')).finally(() => saving(false)); + }, + }, + [ + formItem({ label: '标题', value: title, required: true, rules: [{ max: 20 }] }, textField({ value: title, maxCount: 20 })), + formItem({ label: '权重', value: weight, hint: '0–100%,一位小数' }, inputNumber({ value: weight, min: 0, max: 100, step: 0.1, precision: 1 })), + formItem({ label: '上架', value: online }, switchButton({ label: '保存后自动上架', checked: online, loading: saving })), + ], +); +affix({ position: 'bottom', offset: 0 }, h('div', { class: 'row' }, + button({ label: '保存', type: 'submit', disabled: saving }), +)); +``` + +要点: +- 长表单的操作条用 `affix({ position: 'bottom' })` 贴底固定,翻到表单底部按钮也不丢;提交按钮 `type: 'submit'` 走 `form` 聚合校验。 +- 校验失败时 `form` 顶部的汇总条会播报「有 N 项需要修改」并聚焦第一处(`errorSummary: false` 可关);`hint` 写格式说明,报错时自动让位。 +- 提交期间用同一个 `saving` 信号锁三处:按钮 `disabled`、开关 `loading`(转圈 + aria-busy)、业务请求出口,防重复提交与中途改状态。 +- 长度约束一处写够:`textField` 的 `maxCount` 设原生上限并实时计数,`formItem` 的 `rules: [{ max }]` 只做提交兜底,两处数字保持一致。 + ## 通用约定 - 状态一律放信号(`signal` / `computed`),组件只读写信号,不持有业务数据副本。