Skip to content

JsonSchema 数据协议

低代码表单开发中,JSON Schema 是最核心的协议。它把“一个表单”拆成可序列化、可存储、可动态计算的结构描述。

结构

先建立一个总认知:JSON Schema = 表单结构 + 字段行为 + 运行时联动规则

FormSchema 的结构可以分成 4 层:

  1. FormSchema:表单级配置(全局样式、按钮、初始值等)
  2. items: FormItemType[]:字段树(每个节点就是一个表单项)
  3. FormItemType.items:子节点(用于布局组件/容器组件的嵌套)
  4. rules / linkages / when / show:字段行为与联动规则
ts
type FormSchema = {
  // A. 表单全局配置
  labelWidth?: number
  labelAlign?: 'top' | 'left' | 'right'
  size?: 'default' | 'small' | 'large'
  disabled?: boolean
  initialValues?: Record<string, any>
  submitBtn?: boolean
  resetBtn?: boolean
  // ...

  // B. 字段树
  items?: FormItemType[]
}

interface FormItemType {
  // C. 字段语义
  label?: string
  name: string
  required?: boolean
  help?: string

  // D. 渲染配置
  component: string
  componentProps?: Record<string, any>

  // E. 行为配置
  when?: boolean | string
  show?: boolean | string
  rules?: FormRules
  linkages?: FormLinkage[]

  // F. 嵌套
  items?: FormItemType[]
}

结构关系图

text
FormSchema
├─ 全局配置(labelWidth/size/disabled/...)
├─ initialValues(业务初始值)
└─ items[]
   ├─ FormItemType(普通字段)
   │  ├─ component + componentProps
   │  ├─ rules / linkages
   │  └─ name(支持 deep path,如 user.profile.name)
   └─ FormItemType(容器字段)
      └─ items[](继续递归)

两个容易混淆的点

  1. initialValues(表单级)用于业务初始值,会进入表单数据。
  2. defaultValue(字段级)用于组件展示默认值,不一定写回 formValues

示例

json
{
  "labelWidth": 150,
  "labelAlign": "right",
  "size": "default",
  "scrollToError": true,
  "submitBtn": true,
  "resetBtn": true,
  "items": [
    {
      "label": "用户名",
      "name": "username",
      "component": "Input",
      "required": true,
      "componentProps": {
        "placeholder": "请输入用户名"
      }
    },
    {
      "label": "密码",
      "name": "password",
      "component": "Password",
      "required": true,
      "componentProps": {
        "placeholder": "请输入密码"
      }
    },
    {
      "label": "确认密码",
      "name": "confirmPassword",
      "component": "Password",
      "show": "{{ $values.password }}",
      "componentProps": {
        "placeholder": "请再次输入密码"
      },
      "rules": [
        {
          "type": "jsExpr",
          "value": "{{ $values.password === $values.confirmPassword }}",
          "message": "两次密码不一致"
        }
      ]
    }
  ]
}

配置

下面是协议中的常用字段说明(以当前类型定义为准)。

表单全局配置(FormSchema)

参数名类型默认值描述
labelWidthnumber150全局标签宽度
labelAlign'left' | 'top' | 'right''right'全局标签对齐
colonbooleanfalse标签后是否显示冒号
size'small' | 'default' | 'large''default'全局组件尺寸
disabledbooleanfalse是否禁用整个表单
hideRequiredAsteriskbooleanfalse是否隐藏必填星号
scrollToErrorbooleanfalse提交校验失败时是否滚动到错误项
initialValuesRecord<string, any>-表单初始值(业务数据)
itemsFormItemType[][]表单字段树
styleany-表单容器行内样式
styleBlockstring-以 CSS 文本形式注入样式
formIdstring-表单 id(用于样式隔离等场景)
submitBtnbooleantrue是否显示提交按钮
resetBtnbooleantrue是否显示重置按钮

表单项配置(FormItemType)

参数名类型默认值描述
labelstring-字段标签
labelWidthnumber-当前字段标签宽度(覆盖全局)
labelAlign'top' | 'left' | 'right'-当前字段标签对齐(覆盖全局)
size'default' | 'small' | 'large'-当前字段尺寸(覆盖全局)
namestring-字段唯一标识,支持路径写法,如 info.basic.name
componentstring-渲染组件标识
componentPropsRecord<string, any>{}透传给组件的 props
requiredbooleanfalse是否必填
defaultValueany-组件展示层默认值
helpstring-帮助提示
alertstring-警示文案
whenboolean | stringtrue是否渲染(false 时不挂载)
showboolean | stringtrue是否显示(隐藏但仍保留挂载)
rulesFormRules-校验规则数组
itemsFormItemType[]-子节点(容器/布局组件使用)
classany-字段 class
styleany-字段 style
linkagesFormLinkage[]-字段值变化时的联动配置
designKeystring-设计器内部字段 key

联动配置(FormLinkage)

参数名类型默认值描述
targetstring-目标字段 name
type'attr' | 'data'-联动类型:属性联动/数据联动
conditionany-触发条件(可配表达式)
valueany-要写入的值
pathstring-目标写入路径(属性联动常用)
customPathstring-自定义路径

校验规则(RuleItem)

参数名类型默认值描述
type'required' | 'min' | 'max' | 'pattern' | 'builtin' | 'enum' | 'custom' | 'jsExpr'-规则类型
valueany-规则参数值
messagestring-校验失败提示
trigger'blur' | 'change'-触发时机