如何在@rjsf/core中为object类型自定义JSON文本框组件?
解决@rjsf/core自定义JSON输入组件不生效的问题
你遇到的是@rjsf/core的常见限制——对于type: object的字段,框架默认使用ObjectField组件渲染,而非普通widget,所以直接通过ui:widget指定自定义组件不会生效。要实现文本框输入自由JSON的需求,需要自定义Field组件而非Widget,具体步骤如下:
1. 自定义JsonField组件
替换原来的JsonWidget,实现一个能处理JSON序列化/解析的Field组件:
import { useField } from "@rjsf/core"; export function JsonField(props) { const { schema, name, onChange, value } = useField(props); // 将对象序列化为格式化的JSON字符串,用于文本框显示 const jsonValue = value ? JSON.stringify(value, null, 2) : ""; // 处理文本框输入,解析JSON并更新表单值 const handleChange = (e) => { try { const parsedValue = e.target.value ? JSON.parse(e.target.value) : {}; onChange(name, parsedValue); } catch (err) { console.error("JSON格式错误:", err); // 可在此添加错误提示UI,比如显示红色提示文字 } }; return ( <div> <label htmlFor={name}>自由JSON输入</label> <textarea id={name} value={jsonValue} onChange={handleChange} rows={8} style={{ width: "100%", fontFamily: "monospace" }} /> </div> ); }
2. 修改表单配置
在App组件中,将自定义Field传入fields属性,并通过ui:field指定使用该组件:
import RjsfCoreForm from "@rjsf/core"; import { JsonField } from "./JsonField"; const schema = { type: "object", properties: { free_object: { type: "object", additionalProperties: true } } }; const uiSchema = { free_object: { "ui:field": "JsonField" } // 用ui:field指定自定义Field }; const fields = { JsonField }; // 自定义Field放在fields对象中 export default function App() { return ( <div className="App"> <h3>Form</h3> <RjsfCoreForm schema={schema} fields={fields} uiSchema={uiSchema} /> </div> ); }
说明
- Field组件负责处理整个字段的渲染和数据交互,而Widget通常用于基础类型(如string、number)的输入控件。
- 上述代码中添加了JSON解析错误的捕获,你可以根据需求扩展错误提示的UI。
内容的提问来源于stack exchange,提问作者Rashomon
相关产品推荐
相关产品推荐

