You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:10:53