如何在JSON Schema中根据布尔值条件修改另一个布尔开关值
实现开关联动:switchA控制switchB的禁用与自动赋值
要实现你要的效果,得明确一个核心点:JSON Schema仅负责数据校验和约束,无法直接修改表单字段的值。自动把switchB设为false的逻辑,需要结合你使用的表单渲染库(比如react-jsonschema-form、vue-json-schema-form等)的自定义事件处理来完成,以下是具体步骤:
1. JSON Schema层面:先做数据合规约束
用if/then/else语法定义规则,确保当switchA为false时,switchB的值必须是false(否则校验不通过):
{ "type": "object", "properties": { "switchA": { "type": "boolean", "title": "开关A" }, "switchB": { "type": "boolean", "title": "开关B" } }, "allOf": [ { "if": { "properties": { "switchA": { "const": false } }, "required": ["switchA"] }, "then": { "properties": { "switchB": { "const": false } }, "required": ["switchB"] } } ] }
2. 表单库层面:实现自动赋值与禁用
以常用的react-jsonschema-form为例,通过监听表单数据变化,主动修改switchB的值并控制禁用状态:
import Form from "@rjsf/core"; const schema = { /* 上面定义的Schema */ }; const uiSchema = { // 根据switchA的值控制switchB的禁用状态 switchB: { "ui:disabled": (formData) => !formData?.switchA } }; const App = () => { const handleChange = ({ formData }) => { // 当switchA变为false时,强制将switchB设为false if (formData.switchA === false && formData.switchB !== false) { return { ...formData, switchB: false }; } return formData; }; return ( <Form schema={schema} uiSchema={uiSchema} onChange={handleChange} /> ); };
如果是Vue的表单库,思路完全一致:监听switchA的变化事件,在回调里修改switchB的绑定值,并设置禁用属性。
3. 为什么你之前的配置无效?
你尝试的const: false只是Schema的校验规则,它只会在数据不符合时抛出校验错误,不会主动修改表单字段的值;而value: false大多是UI组件的默认值设置,不会响应switchA的状态变化。必须通过表单的事件监听逻辑,主动触发数据修改才能实现需求。
内容的提问来源于stack exchange,提问作者unknown 11
相关产品推荐
相关产品推荐

