Skip to content

[决策] 文档站 demo 注册路径 registerFields 的收敛形态:A 下沉到 apps/site / B 改表单托管 / C 保持现状 #3798

Description

@yinlianghui

来自 #3308 / PR #3793 的执行残留决策(objectui 分片 PM 代立,session_01GTRjn8xBqp75dk7kFupVRt)。#3308 裁决第 2 条「收敛废弃的 registerFields(),让注册只剩一条路」的前提在实施中被证伪,终局形态需要维护者拍板。

一句话要拍板的

packages/fieldsregisterFields() + createFieldRenderer()(文档站 demo 注册路径)最终归宿选哪个?

前提证伪的实测(PR #3793 报告在案)

registerFields()不是废弃的重复注册路径,而是文档站的 demo host adapter:它给每个 widget 合成 label/description 与本地 useState + onChange;活路径 registerAllFields() 注册的是裸控件(withFieldCarrier(lazy(widget))),而 FieldWidgetComponentProps.onChange 必填且 widget 无保护调用。文档站 InteractiveDemo 只渲染 SchemaRenderer 不传 value/onChange —— 一次性 probe 实证:直切活路径后 demo 输入框失灵,每击键一条 TypeError: onChange is not a function,受影响约 content/docs/fields/ 26 页中 24 类。

选项(dev 两轴分析,PR #3793 报告原文)

  • A. demo adapter 下沉到 apps/site —— 从 @object-ui/fieldsregisterFields + createFieldRenderer,文档站自持包装器。库侧只剩一条路,文档不坏,改动小。但它把「文档 demo 与真实渲染不一致」这个二元契约原样保留,只换持有者 —— 下一轮 enforce-or-remove 审计还会在同一处绊倒。
  • B. catalog 例子改表单托管({ type: 'form', fields: [...] }),两个包装器都删 —— 文档从此展示真实应用的渲染结果(真表单渲染器拥有 label 与状态)。代价:约 60 个 catalog JSON + 26 个文档页重验,改变文档教什么。dev 荐 B:模型读现文档看到裸字段节点渲染成带 label 的输入框,会照着生成真实应用里既无 label 也无 onChange 的裸节点 —— 文档正在充当错误权威,与 capability-multiselect widget 在实际注册路径上根本不存在 —— 代码注释却说它可从记录表单用 #3308 那条注释同类;B 让文档只能展示真实可行的写法。
  • C. 保持现状,只把声明改对 —— 已由 PR fix(fields): 退役 capability-multiselect widget 名 —— 删注册面与最后一个 hint 消费方,组件保留 (#3308) #3793 落地(误导性 @deprecated JSDoc 改为如实说明),作为 A/B 落地前的安全垫。最省,但两路并存继续长漂移。

现状

Refs: #3308(裁决单)、PR #3793(实测与两轴分析)、ADR-0049 enforce-or-remove、ADR-0056 P1/P2。

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