反应 - 防止表单提交

Som*_*ser 55 javascript reactjs

我一直在试验React.在我的实验性功能,我使用的是Reactstrap框架.当我点击一个按钮,我已经注意到,HTML表单提交.有没有办法在单击按钮时阻止表单提交?

我在这里重新创建了我的问题.我的表单很基本,看起来像这样:

<Form>
  <h3>Buttons</h3> 
  <p>
    <Button color="primary" onClick={this.onTestClick}>primary</Button>&nbsp;
  </p>
</Form>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

edd*_*ere 65

我认为首先值得注意的是,如果没有javascript(普通的html),form当点击<input type="submit" value="submit form">或时,元素会提交<button>submits form too</button>.在javascript中,您可以通过使用事件处理程序并调用e.preventDefault()按钮单击或表单提交来防止这种情况.e是传递给事件处理程序的事件对象.通过反应,两个相关的事件处理程序可以通过表单作为onSubmit,另一个通过按钮通过onClick.

示例:http://jsbin.com/vowuley/edit?html,js,console,output

  • @Sagivb.g 但是 `onSubmit` 中的 `e.preventDefault()` 不会禁用本机验证。 (11认同)
  • +1这是事实。但是请记住,如果使用`e.preventDefault()`,您将失去对浏览器的本机表单验证。 (3认同)

Hau*_*Haf 48

没有JS真正需要......只需type向按钮添加属性值为的属性button

<Button type="button" color="primary" onClick={this.onTestClick}>primary</Button>&nbsp;
Run Code Online (Sandbox Code Playgroud)

默认情况下,按钮元素的类型为"submit",这使得它们提交其封闭的表单元素(如果有).更改type为"按钮"可以防止这种情况发生.

  • 如果你使用的是表格,这样做不会让用户按回车键提交表格,这在我看来是个大问题. (18认同)

Paw*_*wel 18

preventDefault是你正在寻找的.只是阻止按钮提交

<Button onClick={this.onClickButton} ...
Run Code Online (Sandbox Code Playgroud)

onClickButton (event) {
  event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)

如果您有一个要以自定义方式处理的表单,则可以捕获更高级别的事件onSubmit,这也将阻止该按钮提交.

<form onSubmit={this.onSubmit}>
Run Code Online (Sandbox Code Playgroud)

在代码中

onSubmit (event) {
  event.preventDefault();

  // custom form handling here
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!`&lt;form onSubmit={e =&gt; { e.preventDefault(); }} &gt;` 允许我在表单上有一个提交按钮,但在提交表单时没有页面刷新。 (3认同)

Yon*_*wit 13

确保将 onSubmit 属性放在表单上而不是按钮上,以防万一您有 from。

<form onSubmit={e => e.preventDefault()}>
    <button onClick={this.handleClick}>Click Me</button>
</form>
Run Code Online (Sandbox Code Playgroud)

确保将按钮 onClick 属性更改为您的自定义函数。

  • 这将不允许通过按 Enter 键提交表单。您最好完全删除按钮的“onClick”处理程序(导致按钮提交表单)并将处理程序放在“onSubmit”事件上,确保在处理程序中保留“preventDefault()”调用以停止旧式表单提交。 (2认同)

EQu*_*per 6

2种方式

首先,我们将参数中的事件传递给onClick.

  onTestClick(e) {
    e.preventDefault();
    alert('here');
  }
Run Code Online (Sandbox Code Playgroud)
  // Look here we pass the args in the onClick
  <Button color="primary" onClick={e => this.onTestClick(e)}>primary</Button>&nbsp;
Run Code Online (Sandbox Code Playgroud)

第二个我们将它传递给参数,我们在onClick中做得很好

  onTestClick() {
    alert('here');
  }
Run Code Online (Sandbox Code Playgroud)
  // Here we did right inside the onClick, but this is the best way
  <Button color="primary" onClick={e => (e.preventDefault(), this.onTestClick())}>primary</Button>&nbsp;
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助