跳转到内容

JSON 表单 JsonForm

默认不传 adapter 时,JsonForm 直接消费组件库自己的 schema 结构,适合业务表单、后台配置页和低代码配置面板。下面示例演示了通过一个 computed 同时处理 checkbox 控制显示/禁用、以及下拉分支字段切换。

传入 adapter={A2UI_0_8} 后,组件会严格按 A2UI 0.8 的组件节点包装格式接收数据,再翻译成 JsonForm 内部 schema。除了 Basic Catalog 里的 TextFieldDateTimeInputCheckBoxMultipleChoiceRow / Column,现在也支持按同一层包装格式接入自定义 catalog 节点,例如 SelectSwitchTreeSelectTransfer 等,覆盖 JsonForm 当前全部组件类型。示例同样使用一个 computed 输出动态节点列表,实现开关控制和分支表单。

如果业务里已经有脚本输入框、地图选点器、审批人选择器等字段组件,可以通过 ConfigProviderjson-form.components 统一注入。下面示例里用组件库的 Textarea 模拟了业务自定义字段,并结合一个 computed 统一处理模式切换、字段显示/隐藏与禁用状态。推荐配合 defineJsonFormComponentsdefineJsonFormSchemas 一起使用,这样 schema 里的 typecomponentProps 都能保留 TypeScript 推导。

参数名描述类型默认值
schemas表单 schema。默认模式下使用 JsonFormSchema[],A2UI 0.8 模式下使用 JsonFormA2UI_0_8ComponentNode[]JsonFormSchema[] | JsonFormA2UI_0_8ComponentNode[][]
adapterschema 适配器。不传时使用组件库原生格式,传入 A2UI_0_8 时按 A2UI 0.8 节点结构解析'default' | 'a2ui-0.8''default'
v-model表单数据对象Record<string, unknown>{}
model非受控场景下的兼容数据对象Record<string, unknown>-
hide-label是否隐藏 labelbooleanfalse
hide-asterisk是否隐藏必填星号booleanfalse
show-colon是否显示冒号booleanfalse
component用来自定义外层表单容器,默认使用 <sd-form>string | ComponentForm
字段描述类型
field表单字段路径。默认模式使用点路径,例如 user.namestring
label表单项标题string
type字段组件类型,内置支持 inputselectdatePickerswitch 等,也可以接入自定义组件名string
required是否生成默认必填规则boolean
hidden是否隐藏当前字段(隐藏后不渲染表单项)boolean
componentProps透传给字段组件的 propsJsonFormComponentProps<T>
componentEvents透传给字段组件的事件JsonFormComponentEvents<T>
componentSlots透传给字段组件的具名 slot 渲染器Record<string, Component | (() => VNodeChild)>
formItemProps透传给 <sd-form-item> 的 propsOmit<FormItemProps, 'field' | 'label' | 'rules'>
formItemRules自定义校验规则FieldRule | FieldRule[]
slotName使用外部 slot 渲染当前字段string
render直接提供渲染函数() => VNodeChild
childrentype="row" 时的子字段列表JsonFormSchema[]
字段描述类型
adapter当前作用域下 JsonForm 的默认适配器JsonFormAdapter
components自定义字段组件注册表JsonFormComponentRegistry

当你的表单配置直接来自 A2UI Agent、Surface JSON 或 Basic Catalog 组件列表时,优先使用 A2UI_0_8。这样可以保留 A2UI 原始节点结构,减少中间层手写 schema 的工作量,也避免业务代码里散落魔法字符串。

A2UI 0.8 的标准 Basic Catalog 里,表单相关节点主要是 TextFieldCheckBoxSliderDateTimeInputMultipleChoice,以及 Row / Column 布局。对于业务自己的 A2UI 0.8 custom catalog,只要仍然遵守同样的 {"id": "...", "component": { "ComponentName": { ... }}} 包装格式,就可以映射到 JsonForm 的全部内置组件类型。

未来会补 A2UI 0.9 适配,但 0.9 目前仍是草稿协议,当前版本只实现并验证了 0.8。

自定义组件怎么获得类型推导?

Section titled “自定义组件怎么获得类型推导?”

推荐在业务代码里先声明组件注册表,再用它创建 schema:

import {
A2UI_0_8,
defineJsonFormComponents,
defineJsonFormSchemas,
} from '@sdata/web-vue';
const components = defineJsonFormComponents({
scriptField: ScriptField,
});
const createSchemas = defineJsonFormSchemas<typeof components>();
const schemas = createSchemas([
{
field: 'script',
type: 'scriptField',
componentProps: {
placeholder: '例如:const start = true;',
},
},
]);
<sd-json-form :adapter="A2UI_0_8" :schemas="schemasFromAgent" />