使用react-jsonschema-form开发表单遇onSubmit异常:页面重载且函数未执行
嘿,我来帮你排查下这个问题——用react-jsonschema-form时点击提交按钮页面重载、onSubmit函数完全没执行,这情况我碰到过好多次,通常是这几个常见坑导致的,咱们一个个捋:
1. 不小心嵌套了原生<form>标签
很多人会习惯在react-jsonschema-form的Form组件外面再套一层原生的<form>标签,但Form组件本身已经是一个完整的表单容器了。外层的原生form会直接触发浏览器默认的页面提交行为,导致页面重载,同时跳过了组件的onSubmit逻辑。
解决办法:直接去掉外层的原生<form>,只保留组件提供的Form即可。
错误写法:
<form> <Form schema={mySchema} onSubmit={handleFormSubmit} /> </form>
修正后:
<Form schema={mySchema} onSubmit={handleFormSubmit} />
2. onSubmit函数的写法或绑定有误
react-jsonschema-form的onSubmit需要接收一个回调函数,这个函数会拿到formData(表单数据)和event两个参数。如果你的函数写法不对,或者不小心直接执行了函数(而不是绑定),就会导致逻辑不触发。
比如不要写成onSubmit={handleFormSubmit()}(这会在组件渲染时就执行函数,而不是点击按钮时),要写成onSubmit={handleFormSubmit}或者用箭头函数包裹。另外,保险起见可以在函数里手动阻止默认行为:
正确示例:
const handleFormSubmit = (formData, event) => { // 手动阻止默认提交行为,避免意外重载 event?.preventDefault(); console.log('拿到的表单数据:', formData); // 这里写你的业务逻辑 }; <Form schema={mySchema} onSubmit={handleFormSubmit} />
3. 表单验证未通过,但你没看到错误提示
react-jsonschema-form默认会在表单验证不通过时阻止提交,但如果你的schema里有必填字段没填,又没开启错误提示,就会以为是onSubmit没执行——实际上是验证拦截了提交,要是还有外层原生form的话就会触发页面重载。
解决办法:
- 检查你的schema配置,确认必填字段(比如
"required": ["username", "email"])都已正确填写; - 开启表单的错误提示,比如设置
showErrorList="top"让错误信息显示在表单顶部:
<Form schema={mySchema} onSubmit={handleFormSubmit} showErrorList="top" />
4. 自定义提交按钮时没阻止默认行为
如果你没有用组件自带的提交按钮,而是自己写了<button type="submit">,那一定要在点击事件里阻止默认行为,否则浏览器会触发原生表单提交,直接重载页面。
正确的自定义按钮写法:
<Form schema={mySchema} onSubmit={handleFormSubmit}> {({ formData, handleSubmit }) => ( <div> {/* 自定义提交按钮 */} <button type="submit" onClick={(e) => { e.preventDefault(); handleSubmit(formData); }} > 提交表单 </button> </div> )} </Form>
内容的提问来源于stack exchange,提问作者César Lobato Fernández

