发现于 #3986 的波及面测量(PR #4013),与该 PR 语义中性(修复前后这条路径同样落空),单独立单。
机制
packages/components/src/renderers/form/form.tsx:944 的级联清值 effect 取 resolvedType = f.widget || f.type(RAW,未过 normalizeFieldType)与 CASCADE_OPTION_FIELD_TYPES(裸名集合 {select, radio, multiselect, checkboxes})比对。对象表单生产者发出的是带前缀 id(field:select / field:multiselect 等),于是任何来自对象 schema 的选项字段都进不了这个 effect:级联父值变化、子字段选项集收窄后,旧值不会被清掉,可能以脏值提交。
同文件 :1514 的 isOptionField 已在 #3231 里用 normalizeFieldType 修过完全同族的问题 —— :944 是漏掉的第二处。
修法
:944 的比对同样过 normalizeFieldType(与 :1514 对齐)。修复会让对象表单路径首次获得级联清值行为 —— 这是行为变化不是等价重构,钉子按「收窄后旧值被清」的正向断言写,并保留裸名路径(手写 SDUI)的既有行为对照。
参考
发现于 #3986 的波及面测量(PR #4013),与该 PR 语义中性(修复前后这条路径同样落空),单独立单。
机制
packages/components/src/renderers/form/form.tsx:944的级联清值 effect 取resolvedType = f.widget || f.type(RAW,未过normalizeFieldType)与CASCADE_OPTION_FIELD_TYPES(裸名集合{select, radio, multiselect, checkboxes})比对。对象表单生产者发出的是带前缀 id(field:select/field:multiselect等),于是任何来自对象 schema 的选项字段都进不了这个 effect:级联父值变化、子字段选项集收窄后,旧值不会被清掉,可能以脏值提交。同文件
:1514的isOptionField已在 #3231 里用normalizeFieldType修过完全同族的问题 ——:944是漏掉的第二处。修法
:944的比对同样过normalizeFieldType(与:1514对齐)。修复会让对象表单路径首次获得级联清值行为 —— 这是行为变化不是等价重构,钉子按「收窄后旧值被清」的正向断言写,并保留裸名路径(手写 SDUI)的既有行为对照。参考
packages/components/src/renderers/form/form.tsx:944(缺陷位)、:250(集合定义)、:1514(同族已修的先例)emptyHint被每个选项 widget 丢弃,用户看到的是硬编码英文 #3231(裸名/前缀名同指一种字段、只认裸名致逻辑落空 —— 同根源先例)multiple: true的 select 字段在对象表单里 host label 仍然惰性 —— 按字段类型键入的 labelling 声明碰不到它(#3975 修完后的实测残留) #3986 / PR fix(fields): resolve select + multiple to field:multiselect so its host label names the chip group #4013(发现来源,测量表在其 PR 正文)