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/main 1ef236e18,与 #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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions