Skip to content

Schema 配置参考

完整的 v3sf Schema 结构和字段属性说明。

根节点结构

每个 Schema 的根节点必须是一个 type: 'object' 对象,通过 properties 定义表单字段。

json
{
  "type": "object",
  "properties": {
    "fieldName": {
      "type": "string",
      "title": "字段标签"
    }
  }
}

字段在表单中的渲染顺序与 properties 中的定义顺序一致。

字段属性一览

属性类型默认值说明
typeValueType必需。 字段值类型,见下方 值类型
titlestring字段显示标签
widgetstring渲染组件名称,不指定时根据 type 自动推断
requiredboolean | expressionfalse是否必填,支持表达式
placeholderstring占位提示文本
disabledboolean | expressionfalse是否禁用,支持表达式
readonlyboolean | expressionfalse是否只读,支持表达式
hiddenboolean | expressionfalse是否隐藏,支持表达式
displayType'row' | 'column'继承组件级标签与输入框的布局方式
classNamestring自定义 CSS 类名
borderboolean继承组件级是否显示边框
enum(string | number)[]选项值数组,用于 select/radio/checkbox 等
enumNames(string | number)[]选项标签数组,与 enum 一一对应
rulesValidatorRule | ValidatorRule[]校验规则,支持单条或数组
propsRecord<string, any>透传给底层 UI 组件的额外属性,值支持表达式
propertiesRecord<string, Schema>嵌套字段定义(typeobject 时使用)

expression{{ }} 表达式字符串,详见 表达式联动

值类型

type 属性决定字段的数据类型和默认渲染组件。

type说明默认 widgetJS 值类型
string字符串inputstring
number数字number / steppernumber
boolean布尔值switchboolean
array数组(多选)checkboxany[]
date日期date取决于适配器
object嵌套对象递归渲染子 propertiesobject

当 Schema 中未指定 widget 时,引擎使用以下映射自动选择组件:

ts
const typeWidgetMap = {
  string: 'input',
  number: 'number',
  boolean: 'switch',
  array: 'checkbox',
  date: 'date',
}

选项字段

对于 selectradiocheckboxpicker 等选项类组件,使用 enumenumNames 定义选项:

json
{
  "department": {
    "type": "string",
    "title": "部门",
    "widget": "select",
    "enum": ["engineering", "product", "design"],
    "enumNames": ["工程部", "产品部", "设计部"]
  }
}
  • enum — 选项的实际值,最终存入表单数据
  • enumNames — 选项的显示标签,与 enum 一一对应

嵌套对象

typeobject 时,可以在 properties 中定义子字段,实现嵌套数据结构。

json
{
  "address": {
    "type": "object",
    "title": "地址",
    "properties": {
      "province": {
        "type": "string",
        "title": "省份"
      },
      "city": {
        "type": "string",
        "title": "城市"
      }
    }
  }
}

对应的表单数据结构为:

json
{
  "address": {
    "province": "浙江",
    "city": "杭州"
  }
}

透传属性

通过 props 向底层 UI 组件传递额外属性。props 中的值也支持 {{ }} 表达式。

json
{
  "quantity": {
    "type": "number",
    "title": "数量",
    "widget": "stepper",
    "props": {
      "min": 1,
      "max": "{{ $values.isVip ? 999 : 99 }}",
      "step": 1
    }
  }
}

具体可传哪些属性取决于底层 UI 组件,请参考对应 UI 库的文档。

表达式语法

v3sf 支持在 requireddisabledreadonlyhidden 以及 props 中使用 {{ }} 表达式,实现字段间的动态联动。

格式

"{{ 表达式 }}"

表达式是一个字符串值,以 {{ 开头、}} 结尾。引擎会实时求值并更新对应属性。

可用变量

变量说明
$values整个表单的数据对象,通过 $values.fieldName 访问任意字段值
$selfValue当前字段自身的值
$deps外部依赖数据(通过组件的 deps prop 传入)

支持的运算符

  • 比较:===!====!=<<=>>=
  • 逻辑:&&||!
  • 算术:+-*/%
  • 三元:条件 ? 值A : 值B
  • 属性访问:obj.prop(支持 null 安全访问)
  • 字面量:数字、字符串('...'"...")、truefalsenullundefined

示例

json
{
  "hidden": "{{ $values.type !== 'other' }}",
  "required": "{{ $values.age >= 18 }}",
  "disabled": "{{ !$values.agree }}",
  "props": {
    "max": "{{ $values.quantity > 10 ? 100 : 50 }}"
  }
}

安全说明

v3sf 使用自研的表达式引擎(基于 AST 解析 + 求值),不会调用 evalnew Function,可安全用于用户输入的 Schema。不支持函数调用和赋值操作。

更详细的表达式用法请参阅 表达式联动

校验规则

通过 rules 属性定义字段校验规则,支持单条或数组形式。

ValidatorRule 属性

属性类型说明
requiredboolean是否必填
patternRegExp | string正则校验
minnumber最小值 / 最小长度
maxnumber最大值 / 最大长度
lennumber精确长度
typestring值类型校验(stringnumberbooleanarray
messagestring校验失败提示信息,支持 ${name} 变量
custom(value, formData) => string | true自定义校验函数

示例

json
{
  "username": {
    "type": "string",
    "title": "用户名",
    "rules": [
      { "required": true, "message": "请输入用户名" },
      { "min": 2, "max": 20, "message": "长度 2-20 个字符" },
      { "pattern": "^[a-zA-Z0-9_]+$", "message": "只能包含字母、数字和下划线" }
    ]
  }
}

更详细的校验用法请参阅 表单校验

FormRef 实例方法

通过 ref 获取表单实例后,可调用以下方法:

方法类型说明
getFormData()() => FormData获取当前表单数据
validate(scrollToError?)(boolean?) => Promise<ErrorMessage[]>校验全部字段,返回错误列表
validateFields(fields, scrollToError?)(string[], boolean?) => Promise<ErrorMessage[]>校验指定字段

ErrorMessage 结构:

ts
interface ErrorMessage {
  name: string // 字段名
  error: string[] // 错误信息列表
}

完整示例

json
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "title": "姓名",
      "required": true,
      "placeholder": "请输入姓名",
      "rules": { "required": true, "message": "请输入姓名" }
    },
    "gender": {
      "type": "string",
      "title": "性别",
      "widget": "radio",
      "enum": ["male", "female"],
      "enumNames": ["男", "女"]
    },
    "age": {
      "type": "number",
      "title": "年龄",
      "widget": "stepper",
      "rules": { "min": 1, "max": 150, "message": "请输入有效年龄" }
    },
    "department": {
      "type": "string",
      "title": "部门",
      "widget": "select",
      "enum": ["engineering", "product", "design"],
      "enumNames": ["工程部", "产品部", "设计部"]
    },
    "startDate": {
      "type": "date",
      "title": "入职日期",
      "widget": "date",
      "required": true
    },
    "isManager": {
      "type": "boolean",
      "title": "是否管理层",
      "widget": "switch"
    },
    "teamSize": {
      "type": "number",
      "title": "团队人数",
      "widget": "stepper",
      "hidden": "{{ !$values.isManager }}",
      "required": "{{ $values.isManager }}"
    }
  }
}

Released under the MIT License.