ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NocoBase 字段组件(Field Component):字段 UI 展示组件的切换机制与配置指南

NocoBase 字段组件(Field Component):字段 UI 展示组件的切换机制与配置指南 NocoBase 字段组件Field Component字段 UI 展示组件的切换机制与配置指南【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase导读在 NocoBase 的可视化界面搭建体系中字段组件Field Component是决定字段值在表单、表格、详情等区块中以何种 UI 形态呈现的载体。同一个字段在底层只有一种数据类型但在界面上却可以挂载多种展示组件——例如 URL 字段可以显示为可点击的链接也可以切换为预览卡片关系字段可以在数据选择器、子表单、子表格等形态之间切换。本文基于 field-component.md 展开结合源码剖析组件切换的底层机制、不同字段类型的可选组件清单以及如何在自己的插件中为字段扩展新的组件选项。一、什么是字段组件字段组件是用于展示字段内容的载体。字段的数据类型如字符串、数字、日期、关联关系决定其能存什么而字段组件决定怎么展示、怎么录入。部分字段内置多种展示组件用户可根据实际需求选择合适的组件以不同的方式呈现字段的值。举例来说一个阅读态下的 URL 字段可以切换为预览组件Input.Preview以卡片/预览形式展示 URL 内容URL 组件默认Input.URL以可点击链接的形式展示。同样关系字段关联字段可以切换为子表单Subform子表格Subtable仅对一对多等多记录关系支持数据选择器 / 记录选择器Record picker下拉选择器默认Select / AssociationSelect文件管理器File manager仅当关系目标表为文件表时支持。从源码实现看这一机制的核心数据结构位于 CollectionFieldInterface.ts每个字段接口Field Interface可以通过componentOptions?: CollectionFieldInterfaceComponentOption[]声明自己支持的组件选项列表每个选项包含label展示名称、value组件标识即 Formily schema 中的x-component、可选的useVisible动态可见性与useProps切换时的默认属性。二、字段组件切换的底层机制2.1 切换入口SchemaSettings 中的 Field component字段组件切换入口是字段设置Schema Settings中的 Field component 下拉项。其实现位于 fieldComponent.ts核心逻辑如下可见性判断useVisible通过useCollectionField()获取当前字段再通过collectionFieldInterfaceManager.getFieldInterface(collectionField?.interface)拿到字段接口定义只有当componentOptions是数组、长度大于 1且过滤掉隐藏项后仍大于 1 时该设置项才显示。也就是说单一组件的字段不会出现切换入口。选项渲染useComponentProps将componentOptions过滤后映射为{ label, value, useProps }当前值取fieldSchema[x-component-props]?.[component]缺省时回退到第一个选项。切换写入onChange切换时读取目标组件的useProps作为基础属性拼装出{ component, ...baseProps, ...(与原组件一致的 uiSchema 属性) }写入fieldSchema[x-component-props]并更新 Formily 的field.componentProps最后通过dn.emit(patch, ...)将 schema 变更同步到设计器。可见字段组件本质上是 schema 中x-component-props.component的一个取值切换组件并不会改变字段的数据类型与存储结构只改变其在界面上的渲染方式——这也是它被归入字段设置而非字段类型的原因。2.2 以 URL 字段为例的源码印证url.ts 中UrlFieldInterface的定义完整印证了文档中的示例default { type: text, uiSchema: { type: string, x-component: Input.URL, // 默认组件 }, }; componentOptions [ { label: URL, value: Input.URL }, // 链接展示 { label: Preview, value: Input.Preview }, // 预览展示 ];默认组件Input.URL位于default.uiSchema[x-component]与componentOptions第一项一致。CollectionFieldInterface基类的addComponentOption方法CollectionFieldInterface.ts还演示了默认组件的自动推导逻辑若未显式声明componentOptions会依据default.uiSchema[x-component]自动生成首项Input前缀的组件会以 schematype大写作为标签其他组件取x-component最后一段。三、关系字段的组件选项矩阵关系字段关联字段是组件切换最丰富的场景。旧版客户端中通过 useFieldComponentOptions.ts 集中定义了关系字段的组件候选其规则与文档描述完全对应关系类型interface可选组件value说明o2o/oho/obo一对一、一对多主从、多对一主从Record pickerCollectionField、SubformFormField、SelectAssociationSelect单记录关系默认含子表单o2m一对多Record pickerCollectionField、SubtableTableField、SelectAssociationSelect子表格仅对多记录关系支持m2o/m2m/linkTo多对一、多对多、关联链接Record pickerCollectionField、SelectAssociationSelect不含子表单/子表格目标表为文件表collection.template fileRecord pickerCollectionField、SelectAssociationSelect文件管理器组件在文件表场景下额外可用关键细节默认组件是 Record picker数据/记录选择器对应值CollectionField即使用目标表的默认字段组件下拉选择器由AssociationSelect组件提供与文档中下拉选择器默认的表述对应——此处默认指记录选择器在多数场景下是默认呈现形态文件管理器File manager仅当关系目标表为file模板时支持对应 fileManagerComponentFieldSettings.tsx 等模块的设置实现。在新版数据源DataSource架构中关系字段组件同样由componentOptions声明。需要说明的是具体字段接口的componentOptions组合会随客户端版本演进以上为旧版useFieldComponentOptions的静态规则可作为理解组件候选集的参考基线。四、不同组件场景下的字段设置切换字段组件后部分组件带有独立的字段设置项。在 packages/core/client/src/modules/fields/component 目录下可以找到各类组件的专属设置实现级联选择器cascadeSelectComponentFieldSettings.tsx文件管理器fileManagerComponentFieldSettings.tsx子表单Nester/SubformsubformComponentFieldSettings.tsx记录选择器PickerrecordPickerComponentFieldSettings.tsx子表单弹窗PopoverNestersubformPopoverComponentFieldSettings.tsx下拉选择器SelectselectComponentFieldSettings.tsx子表格SubTablesubTablePopoverComponentFieldSettings.tsx标签TagtagComponentFieldSettings.tsx这些设置文件共同说明字段组件不仅决定渲染形态还决定该组件特有的配置面板如子表单的字段选择、选择器的数据范围、标签的颜色映射等。五、为字段扩展自定义组件插件开发视角若要在自己的插件中为某个字段接口新增组件选项可通过CollectionFieldInterface的addComponentOption方法注册新选项其签名CollectionFieldInterface.ts为addComponentOption(componentOption: CollectionFieldInterfaceComponentOption): void // CollectionFieldInterfaceComponentOption { // label: string; // 在 Field component 下拉中展示的名称 // value: string; // Formily 组件名x-component // useVisible?: () boolean; // 动态控制该选项是否可见 // useProps?: () any; // 切换时的默认组件属性 // }扩展步骤要点在插件初始化时通过collectionFieldInterfaceManager获取目标字段接口实例调用addComponentOption({ label, value, useProps })追加组件选项保证value对应的 Formily 组件已注册到 schema 组件库中如需专属设置面板可参照 modules/fields/component 下的模式注册对应的 SchemaSettings 项。从fieldComponentSettingsItem.useVisible的实现可见只要某字段的可用组件数大于 1字段组件切换入口就会自动出现在字段设置中插件扩展无需额外改动设置面板代码。六、常见问题与注意事项切换组件是否影响数据不影响。组件切换只修改 schema 中的x-component-props.component字段类型与存储不变。为什么有些字段看不到字段组件设置项因为该字段接口的componentOptions数量不足 2 个或可用项过滤后不足 2 个见 fieldComponent.ts。子表格为什么只对部分关系可用子表格TableField语义上要求一对多等多记录关系源码中仅o2m分支返回该项useFieldComponentOptions.ts。文件管理器组件何时出现仅当关系目标集合的template file时才作为候选出现。延伸阅读字段设置入口文档form-item.md字段接口管理源码CollectionFieldInterface.ts组件切换设置项实现fieldComponent.ts关系字段组件候选规则旧版客户端useFieldComponentOptions.ts【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表