Skip to content

[fields] 七个 widget 在**可编辑态**也丢掉 host 下发的 id —— label 的 for 悬空、description 零消费者(formula / summary / auto_number / vector / grid / slider / signature 实测) #4857

Description

@yinlianghui

#4788(只读替换显示丢整份 host plumbing)的实施中实测发现的相邻一条,与那个 PR 无关也不由它引入,按 Prime Directive #10 立单(不认领、不扩围)。

#4788 修的是只读态:host 在「readonly + 注册 field widget」时包一层带 id / aria-labelledby / aria-describedby / role="group" 的容器。本条是同一族里 readonly 门管不到的那一半 —— 有七个 widget 在可编辑态也一样丢掉 host 下发的 id,因为它们根本没有可编辑分支,或者有分支但不展开 DOM pass-through。

实测

origin/main1ef236e18,与 #4788 同一套 probe(真 form renderer + 裸注册,字段带 description: 'Some help',一行一个字段),看 editable 列:

formula editable for=DANGLING hostIdEl=NONE consumers=0
summary editable for=DANGLING hostIdEl=NONE consumers=0
auto_number editable for=DANGLING hostIdEl=NONE consumers=0
vector editable for=DANGLING hostIdEl=NONE consumers=0
grid editable for=DANGLING hostIdEl=NONE consumers=0
slider editable for=DANGLING hostIdEl=NONE consumers=0
signature editable for=DANGLING hostIdEl=NONE consumers=0

对照:其余 27 个注册的非 group-labelled 类型在 editable 列全部是 for=RESOLVES-LABELABLE hostIdEl=input/textarea/button consumers=1

即:可见 label 的 for 指向一个整个文档里没有任何元素带的 id,只读态之外也一样 —— 这七个字段在无障碍树里没有名字,渲染出来的帮助文本零消费者。

为什么 #4788 的修法覆盖不到

#4788 的 host 门是 readonly === true。而在真实的对象表单路径上,计算型字段并走 readonly:

packages/plugin-form/src/ObjectForm.tsx:687formula / summary / auto_number 映射成 formField.disabled = true,不是 readonly: true。所以 ObjectForm 渲染出来的公式字段拿不到 #4788 的容器,for 照旧悬空。

另外三个(grid / slider / signature)与 readonly 无关:它们的唯一渲染分支就不展开 host props。

涉及文件

需要一次方向裁决,不要直接推

至少三种形状,取舍不同,不要#4788 外推:

  1. 把 D 组映射成 readonly: true(改 ObjectForm)—— 最小,直接落进 [fields] 非 group-labelled widget 的只读替换显示丢掉 host 下发的整份 plumbing —— label 的 for 悬空、description 零消费者(email / url / phone 实测) #4788 已有的容器机制;但 disabledreadonly 在本仓是有意区分的两件事(form.tsx 的注释写明了),这条改的是语义分类而不只是 a11y;
  2. 给 host 一个 display-only 声明(ComponentMeta 加一维,类似 labelling)—— 契约优先,host 不再靠「registered + readonly」推断;代价是新增一个公开契约键,且漏声明会静默退回今天的坏形状;
  3. widget 侧各自展开 pass-through —— grid / slider / signature 有真控件,这条对它们大概是对的(host id 落到可 label 元素上,for 自然解析);但对 D 组无效,它们渲染的 span 不是 labelable 元素,for 落上去依然惰性([fields] 复合/分组 field widget 丢弃或错投 host 下发的控件 id:address / geolocation 的表单 label for 悬空,checkboxes / radio / rating / file 的 for 落在不可 label 的 div 上 #3961 当初换掉 for 的原因)。

三者可能要分组合用:grid / slider / signature 走 3,D 组走 1 或 2。

参考

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions