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

React表单onSubmit每次按键触发,如何实现回车提交表单?

解决React表单每次按键触发提交+实现回车提交的问题

我来帮你梳理下问题所在,其实是两个小细节导致的:

1. Register按钮的函数调用方式错误

你写的onClick={postRegister({username, password})}是立即执行了postRegister函数,而不是把它作为点击回调传递。每次组件重新渲染(比如输入框输入内容改变状态时),这个函数都会被调用一次,这就是你看到“每次按键都触发提交”的核心原因。

正确的写法应该用箭头函数包裹,让它只有在点击时才执行:

<Button onClick={() => postRegister({username, password})}>Register</Button>

2. Sign In按钮需要设置type="submit"

你的Sign In按钮目前没有指定type属性,默认会是type="button",这会导致表单无法识别它为提交按钮——浏览器默认的回车提交行为,是触发表单内第一个type="submit"的按钮对应的逻辑。

把Sign In按钮改成type="submit",这样点击按钮或者在输入框按回车,都会触发表单的onSubmit事件,而你在postLogin里的e.preventDefault()也能正常阻止浏览器默认的表单跳转行为:

<Button type="submit">Sign In</Button>

3. 移除多余的onKeyPress监听

你之前给密码框加的onKeyPress完全没必要,表单的onSubmit已经天然支持回车提交的逻辑,而且你之前的写法里postLogin()没有传递事件对象,执行时会报错(因为e是undefined),直接删掉这个监听就好。

修改后的完整表单代码

<Form onSubmit={postLogin}>
  <Input 
    type="text" 
    value={username} 
    placeholder="username" 
    onChange={e => setUserName(e.target.value)} 
  />
  <Input 
    type="password" 
    value={password} 
    placeholder="password" 
    onChange={e => setPassword(e.target.value)} 
  />
  <Button type="submit">Sign In</Button>
  <Button onClick={() => postRegister({username, password})}>Register</Button>
</Form>

这样修改后,就不会出现每次按键触发提交的情况,同时在输入框按回车会正常触发postLogin函数,实现你想要的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:17:45