Skip to content

element:record_pickersort / limit 扁平简写:renderer 兑现、schema 未声明(#5775 实施中新测出,A 表之外的第 7 处) #6276

Description

@qq9340100

实施 #5775(维护者裁决方向 A)时,为核实 A 表前提对 objectui HEAD 7dfbeb7 逐行读了 element:record_picker 的 renderer,顺带测出一处 A 表没有记录的同类分歧。#5775 的裁决评论逐键点名了处置对象,sort / limit 不在其中,所以没有夹带进那个 PR —— 单独记在这里。

实测

packages/components/src/renderers/basic/record-picker.tsx(objectui 7dfbeb7):

constds=(schema?.dataSource??{})as{object?: string;filter?: unknown;sort?: unknown;limit?: number};constobject=ds.object??props.object;constfilter=ds.filter??props.filter;constsort=ds.sort??props.sort;// ← props.sort 未声明constlimit=ds.limit??props.limit??50;// ← props.limit 未声明

四个键都走同一个「dataSource 优先、扁平简写兜底」的模式,而 ComponentPropsMap 里(#5775 落地后)objectfilter已声明sortlimit未声明。也就是说同一个 renderer 的同一组兜底里,一半是契约、一半是暗门 —— 一个照着 object/filter 的写法推断出 properties.limit: 20 的作者,会拿到默认的 50 条,零诊断。这正是 ADR-0078 的形状,和 #5775 处理的 labelField 同族。

仓内暂无作者写扁平 sort/limit(showcase 的 page-variables.page.ts:61 走的是 dataSource: { object, limit: 50 },即已声明的那条路),所以今天不打红任何东西 —— 但它是 #5068 error 升级前该清空的同一份清单上的一条。

三个方向(需裁定,不建议顺手补声明)

  • A:补声明 sort / limit,与 object / filter 对齐 —— 四个扁平简写要么都是契约、要么都不是。代价:把「组件级 dataSource 是数据绑定的正统位置」这件事又稀释一次。
  • B:反过来 —— 让 dataSource 成为唯一入口,object / filter 的扁平简写也走 ADR-0087 退役,四个键一起收敛到 dataSource。契约最干净;代价:breaking 面比 A 大得多,且 object 的扁平写法在语料里是主流(element:form / element:filter 等兄弟 element 也都是扁平 object),需要一次跨 element 的统一裁决而不是只看 picker。
  • C:维持现状并在 dataSource.describe() 里写明「sort/limit 只能从这里给」。代价:ADR-0049 的债务原地不动,且和 SDUI props 声明与 renderer 不一致:6 处「renderer 兑现但 ComponentPropsMap 未声明」+ 2 处「声明了没人读」(#5068 error 升级的 spec 侧前置) #5775 刚刚确立的「以被兑现的形状为准」相矛盾。

注:B 的正确范围恐怕不止 picker —— packages/lint/src/validate-component-props.ts 里那条「dataSource 供给了 object 就不报缺失」的豁免正是为这一族写的。所以本单若走 B,应先扩成 element 家族的统一单。

关系

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions