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

使用rjsf ObjectFieldTemplate时输入框频繁失焦问题求助

问题描述

我在package.json中安装了版本为^5.0.0-beta.10的rjsf,能正常渲染react-jsonschema-form的Form组件,但使用自定义ObjectFieldTemplate时,字符串输入框每输入一个字符就会失去焦点,必须重新点击才能继续输入。

我已经尝试将ObjectFieldTemplate移到自定义Form组件定义之外,但问题仍未解决;也参考过状态设置相关的方案,但我使用的是函数式组件,不确定是否适用。

相关代码如下:

import validator from "@rjsf/validator-ajv6"; 
import Form from "@rjsf/mui";
const ObjectFieldTemplate = (props) => {
    // 一些业务逻辑计算
    return (
        <div>
            <h3>{props.title}</h3>
            <p>{props.description}</p>
            {props.properties.map(function (field) {
                // 确定样式的逻辑
                return (<fieldset style={style} key={uuidv4()}>{field.content}</fieldset>);
            })}
        </div>
    );
}

const JsonSchemaForm = (props) => {
    // 定义schema和uiSchema
    const onSubmit = ({formData}, e) => {
        // 提交逻辑
    }
    const onError = (errors) => {console.log(errors);}

    return (<Form 
        schema={schema}
        validator={validator}
        formData={data}
        uiSchema={uiSchema}
        onSubmit={onSubmit}
        onError={onError}
        templates={{ ObjectFieldTemplate }}
        />);
}
解决方案

问题根源在于你在props.properties.map循环中使用uuidv4()作为fieldset的key。每次组件渲染时,uuidv4()都会生成新的随机值,React会判定每个fieldset都是全新的组件,进而卸载旧组件并重新挂载新组件,这直接导致输入框失去焦点。

解决方法很简单,把key替换为每个field的稳定唯一标识,比如field.name或者field.key(根据rjsf的字段结构,field.name通常是唯一的):

{props.properties.map(function (field) {
    // 确定样式的逻辑
    return (<fieldset style={style} key={field.name}>{field.content}</fieldset>);
})}

另外请确认ObjectFieldTemplate确实定义在JsonSchemaForm组件外部,避免每次渲染Form时重新创建模板组件,这也会引发不必要的重渲染问题。

内容的提问来源于stack exchange,提问作者YesNoAbsolutely

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:41:17