在实现 #3272(PR #3392)时发现,未在该 PR 内修改 —— 那一单的 PM 裁定明确划到「组件侧 prop 默认」,设计器元数据是另一个面。
现象
packages/components/src/renderers/form/form.tsx,ComponentRegistry.register('form', …) 的第二个参数(组件元数据)里:
inputs: [
...
{ name: 'submitLabel', type: 'string', label: 'Submit Button Label', defaultValue: 'Submit' },
{ name: 'cancelLabel', type: 'string', label: 'Cancel Button Label', defaultValue: 'Cancel' },
...
],
defaultProps: {
submitLabel: 'Submit',
cancelLabel: 'Cancel',
...
},
#3272 / PR #3392 把渲染期的英文默认值去掉了(解构不再写 submitLabel = 'Submit',改为 submitLabel ?? t('common.submit')),于是「作者没写 label」的表单会跟随会话语言。但上面这两处元数据默认值没动。
为什么记一条
defaultProps 在 packages/core/src/registry/Registry.ts 的注释里写的是 “Default props when dropped” —— 设计器把组件拖进画布时的初始 props。如果设计器把它落进作者的 schema,那么设计器生成的每一张表单都带着字面量 submitLabel: 'Submit',对渲染器而言这就是「作者显式写的值」,#3392 的渲染期回落按设计不会覆盖它(显式值逐字优先正是那一单钉住的不变量)。结果就是 issue #3272 描述的那种「不写 label 的作者被静默锁定英文」在设计器这条产出路径上原样保留。
同理 inputs[].defaultValue 会成为属性面板里预填的英文。
为什么标 finding 而不是直接当 bug 排期
今天本仓运行期够不到它:全仓 grep defaultProps,只有两处消费
| 位置 |
用途 |
packages/core/src/registry/Registry.ts:49 |
类型声明 defaultProps?: Record<string, any> |
packages/core/src/registry/WidgetRegistry.ts:185 |
从 manifest 搬运到 widget 记录 |
packages/react / SchemaRenderer 渲染路径上没有任何一处读它,所以它今天不影响任何渲染文本。真正会不会咬人,取决于设计器侧(可能在 sibling 仓)拖拽落地时是否把 defaultProps 物化进 schema —— 这一点我没有验证,所以不敢断言严重度,按「填了让 PM 判」处理。
修法建议(先裁决再动)
不建议单独改 form 一个组件:defaultProps / inputs[].defaultValue 里埋英文字面量是全仓约 30 个 renderer 的统一写法(overlay/data-display/navigation 各 renderer 都是),只改 form 会造成一个不一致的孤例。真正要问的是:
倾向 B,但这属于契约面/设计器交互的裁决,不该由某一单顺手做。
证据等级
静态证据(读 form.tsx 的注册元数据 + 全仓 grep defaultProps 的消费点),未做浏览器复现,也未验证设计器是否物化。「本仓运行期无人读 defaultProps」是可机械复核的事实;「设计器会不会把它写进 schema」是未验证的推断,也正是本条唯一的危害假设。
关联:#3272 / PR #3392。
在实现 #3272(PR #3392)时发现,未在该 PR 内修改 —— 那一单的 PM 裁定明确划到「组件侧 prop 默认」,设计器元数据是另一个面。
现象
packages/components/src/renderers/form/form.tsx,ComponentRegistry.register('form', …)的第二个参数(组件元数据)里:#3272 / PR #3392 把渲染期的英文默认值去掉了(解构不再写
submitLabel = 'Submit',改为submitLabel ?? t('common.submit')),于是「作者没写 label」的表单会跟随会话语言。但上面这两处元数据默认值没动。为什么记一条
defaultProps在packages/core/src/registry/Registry.ts的注释里写的是 “Default props when dropped” —— 设计器把组件拖进画布时的初始 props。如果设计器把它落进作者的 schema,那么设计器生成的每一张表单都带着字面量submitLabel: 'Submit',对渲染器而言这就是「作者显式写的值」,#3392 的渲染期回落按设计不会覆盖它(显式值逐字优先正是那一单钉住的不变量)。结果就是 issue #3272 描述的那种「不写 label 的作者被静默锁定英文」在设计器这条产出路径上原样保留。同理
inputs[].defaultValue会成为属性面板里预填的英文。为什么标
finding而不是直接当 bug 排期今天本仓运行期够不到它:全仓 grep
defaultProps,只有两处消费packages/core/src/registry/Registry.ts:49defaultProps?: Record<string, any>packages/core/src/registry/WidgetRegistry.ts:185packages/react/SchemaRenderer渲染路径上没有任何一处读它,所以它今天不影响任何渲染文本。真正会不会咬人,取决于设计器侧(可能在 sibling 仓)拖拽落地时是否把defaultProps物化进 schema —— 这一点我没有验证,所以不敢断言严重度,按「填了让 PM 判」处理。修法建议(先裁决再动)
不建议单独改 form 一个组件:
defaultProps/inputs[].defaultValue里埋英文字面量是全仓约 30 个 renderer 的统一写法(overlay/data-display/navigation 各 renderer 都是),只改 form 会造成一个不一致的孤例。真正要问的是:Registry.ts的defaultProps注释里写明这个边界,免得下一个人(尤其是 AI 生成的元数据)以为它会跟随语言。submitLabel从defaultProps拿掉,让它保持未声明)—— 这是与 form.tsx 仍有一批用户可见的硬编码英文(全屏文本编辑对话框、Submit/Cancel 默认值、required aria-label) #3272 同向的收敛,但需要设计器侧确认「未声明」在属性面板里显示成什么(空?占位提示?),并且要一次扫全部 renderer,不是一行改动。倾向 B,但这属于契约面/设计器交互的裁决,不该由某一单顺手做。
证据等级
静态证据(读
form.tsx的注册元数据 + 全仓 grepdefaultProps的消费点),未做浏览器复现,也未验证设计器是否物化。「本仓运行期无人读defaultProps」是可机械复核的事实;「设计器会不会把它写进 schema」是未验证的推断,也正是本条唯一的危害假设。关联:#3272 / PR #3392。