跳转到内容

复杂 Schema 结构

本文介绍 Piying-View 支持的 Valibot 复杂 Schema 类型及其对应的视图表现。每个示例的定义都会渲染出一个可交互的表单

使用 v.object() 嵌套定义对象结构,Piying-View 会自动将 object 类型映射到 Group 组件,递归渲染子字段:

fieldGlobalConfig.types 中确保 object 有对应的容器组件:

options = {
  fieldGlobalConfig: {
    types: {
      object: { type: PiyingViewGroup }, // Group 容器处理嵌套
    },
  },
};

使用 v.array() 定义列表型字段,Piying-View 将 array 映射为 FieldArray,使用数组容器组件渲染:

确保注册了 array 类型:

options = {
  fieldGlobalConfig: {
    types: {
      array: { type: PiyingViewGroup }, // Array 容器处理列表
    },
  },
};

使用 v.tuple() 定义固定长度和类型的数组,Piying-View 将 tuple 映射为 FieldArray,每个位置对应一个子字段:

使用 v.record() 定义动态键值对,Piying-View 将 record 映射为特殊的 Group,键由用户动态添加:

详见 Record Schema 动态对象组

使用 v.intersect() 合并多个 object,Piying-View 将 intersect 转换为 FieldLogicGroup,所有子字段平铺到同一层级:

通过 layout 可以调整 intersect 中字段的顺序和位置:

import { layout } from '@piying/view-angular-core';

const schema = v.intersect([v.pipe(v.object({ name: v.string() }), layout({ priority: 1 })), v.pipe(v.object({ age: v.number() }), layout({ priority: 2 }))]);

使用 v.union() 定义多个可选类型,Piying-View 将 union 也转换为 FieldLogicGroup,用户可以在不同分支间切换:

Valibot Schema FieldControl 类 视图表现
v.string() / v.number() / v.boolean() FieldControl 单个输入控件
v.object() FieldGroup 对象容器(渲染子字段列表)
v.array() FieldArray 数组容器(可增删项)
v.tuple() FieldArray 固定长度数组
v.record() FieldGroup 动态键值对容器
v.intersect() FieldLogicGroup 逻辑分组(字段合并)
v.union() FieldLogicGroup 逻辑分组(分支切换)