使用@rjsf/antd v5时表单必填字段验证失效问题求助
@rjsf/antd v5 表单验证失效及外部提交按钮问题解决
问题背景
使用@rjsf/antd v5和@rjsf/core v5实现表单必填字段(带*标记)验证时,遇到两个核心问题:
- 原生antd
<Form/>组件的验证功能正常,但切换为<RJSFForm/>(应用RJSF的antd主题)后,必填字段验证完全失效 - 需要将提交按钮放在表单组件外部,已隐藏内部提交按钮,通过外部按钮触发提交动作
经开发者工具排查,问题根源是RJSF的antd主题未给必填字段添加required属性,目前已在GitHub提交工单#3743追踪该问题。
临时解决方案
在官方修复前,可以通过以下两种方式解决验证失效问题:
1. 自定义字段组件手动添加required属性
针对字符串、数字等基础字段,自定义对应的组件,渲染时强制传入required属性:
import { RJSFForm } from '@rjsf/antd'; import { Input, Select } from 'antd'; // 自定义输入框组件 const CustomInput = (props) => { const { required, ...restProps } = props; return <Input {...restProps} required={required} />; }; // 自定义选择器组件 const CustomSelect = (props) => { const { required, ...restProps } = props; return <Select {...restProps} required={required} />; }; // 表单schema示例 const formSchema = { type: 'object', properties: { username: { type: 'string', title: '用户名', minLength: 1 }, role: { type: 'string', title: '角色', enum: ['admin', 'user'] } }, required: ['username', 'role'] }; // 在RJSFForm中配置自定义组件 <RJSFForm schema={formSchema} widgets={{ StringField: CustomInput, SelectField: CustomSelect }} submitButton={false} />
2. 外部按钮触发时手动执行表单验证
通过formRef获取RJSFForm的antd表单实例,手动调用validateFields方法完成验证,验证通过后再执行提交逻辑:
import { useRef } from 'react'; import { RJSFForm } from '@rjsf/antd'; import { Button } from 'antd'; const App = () => { const formRef = useRef(null); const handleExternalSubmit = async () => { try { // 手动触发字段验证 await formRef.current.validateFields(); // 验证通过,获取表单数据并提交 const formData = formRef.current.getValues(); // 这里替换为实际的提交逻辑 console.log('提交成功,数据:', formData); } catch (error) { console.log('验证失败:', error); } }; return ( <div> <RJSFForm ref={formRef} schema={formSchema} submitButton={false} /> <Button type="primary" onClick={handleExternalSubmit} style={{ marginTop: 16 }}> 外部提交 </Button> </div> ); };
问题追踪
该问题已在RJSF官方仓库提交工单#3743,后续可关注工单状态获取官方修复进展。
内容的提问来源于stack exchange,提问作者Georgios
相关产品推荐
相关产品推荐

