矩阵字段
矩阵字段让多行问题共用同一组选项,适合评估量表、能力覆盖、权限组合和批量参数选择。字段值始终是普通 JSON 对象,不包含组件状态或运行时标识。
matrix-single:每行选择一项。matrix-multiple:每行选择多项。
行与列由 UI 节点的 matrix 属性声明,值类型和选择限制由 JSON Schema 声明。编译器会核对两部分,配置不一致时拒绝生成 FormPlan。
单选矩阵
单选矩阵的每个行值都是一个 JSON 基础类型。相同行内的 radio 共用原生 name,Tab 进入选项组,方向键移动并选择答案。
{
"assessment": {
"coordination": "expected",
"traceability": "usable",
"recovery": "expected"
}
}受控值结构:
示例值:
多选矩阵
多选矩阵的每个行值都是基础类型数组。minItems、maxItems 和 uniqueItems 分别控制最少选择数、最多选择数和去重。
{
"assessment": {
"coordination": [
"usable",
"expected"
],
"traceability": [
"expected"
],
"recovery": [
"usable"
]
}
}达到 maxItems 后,当前行中未选的选项会禁用,已选项仍可取消。限制只作用于当前行,不影响其他行。
UI 节点属性
矩阵字段沿用通用字段属性,并增加类型明确的 matrix 配置。
UiMatrixDefinition:
行属性
行 id 不能为空,不能包含 .,也不能使用保留值 *。同一矩阵内的行 id 不得重复。
列属性
同一矩阵内的列值必须全部为 string、全部为 number 或全部为 boolean。null 不用作列值;未选择状态由行属性缺失表示。列值不得重复。
单选矩阵 Schema
矩阵本身绑定对象 Schema。每个 matrix.rows[].id 对应一个 properties 条目,行 Schema 的 enum 与列值完全一致。
对象 Schema 必须设置 additionalProperties: false。properties 不能缺少已声明的行,也不能保留未出现在 matrix.rows 中的孤立属性。
多选矩阵 Schema
多选行使用数组 Schema。items.enum 与列值一致,uniqueItems 必须为 true。
minItems 和 maxItems 不能超过列数。父矩阵 Schema 的 required 决定哪些行必须出现在对象中;多选行通常同时设置 minItems: 1,避免空数组通过必选校验。
Designer 配置
组件目录提供“单选矩阵”和“多选矩阵”两个预设。预设会一次写入 UI 节点、对象 Schema、行 Schema 和列值。
属性面板支持:
- 按行编辑问题标题;
- 按行编辑共用选项标题;
- 在单选和多选矩阵之间切换,并同步替换行 Schema;
- 保留已有行
id和列value,标题修改不会重写已有表单值。
校验面板支持:
- 设置整个矩阵是否必填;
- 设置每一行是否必选;
- 设置多选矩阵每行的
minItems与maxItems。
设计画布直接显示行列结构。交互预览使用真实 FormRenderer,选择结果按完整受控对象回传。
键盘与读屏
运行时使用语义化 table、列标题和 scope="row" 行标题。每个控件的无障碍名称由“行标题:列标题”组成。行说明、选择计数、上限和错误信息通过 aria-describedby 关联。
容器宽度不超过 520px 时,矩阵按行转为卡片布局。列标题会出现在每个选项旁边,DOM 仍保留表格语义。响应行为读取嵌入容器宽度,不依赖浏览器窗口宽度。
状态与限制
编译器边界:
超过边界的文档会收到 matrix.limits 诊断。更大的二维数据应采用分页编辑、虚拟化表格或宿主专用组件。
嵌入边界
矩阵值不包含提交记录、权限信息、网络地址或组件内部状态。嵌入式工作流节点配置只需保存普通对象,并通过 value 与 onChange 接入受控状态。
动态列、远程选项和单元格级业务组件不属于内置矩阵契约。此类能力应通过经过审核的自定义节点实现,凭证、请求和副作用继续由宿主控制。