【问题标题】:React - Preventing Form SubmissionReact - 阻止表单提交
【发布时间】:2017-02-10 02:51:57
【问题描述】:

我一直在尝试使用 React。在我的实验中,我使用的是Reactstrap framework。当我点击一个按钮时,我注意到 HTML 表单提交了。有没有办法在单击按钮时阻止表单提交?

我重新创建了我的问题here。我的表单非常基本,如下所示:

<Form>
  <h3>Buttons</h3> 
  <p>
    <Button color="primary" onClick={this.onTestClick}>primary</Button>&nbsp;
  </p>
</Form>

我错过了什么?

【问题讨论】:

  • 似乎与this 相关。尝试将按钮的类型设置为button

标签: javascript reactjs


【解决方案1】:
import React, { Component } from 'react';

export class Form extends Component {
  constructor(props) {
    super();
    this.state = {
      username: '',
    };
  }
  handleUsername = (event) => {
    this.setState({
      username: event.target.value,
    });
  };

  submited = (event) => {
    alert(`Username: ${this.state.username},`);
    event.preventDefault();
  };
  render() {
    return (
      <div>
        <form onSubmit={this.submited}>
          <label>Username:</label>
          <input
            type="text"
            value={this.state.username}
            onChange={this.handleUsername}
          />
          <button>Submit</button>
        </form>
      </div>
    );
  }
}

export default Form;

【讨论】:

  • 此问题已包含多个答案和一个已接受的答案。您能否解释(通过编辑您的答案)您的答案与其他答案的不同之处?也知道从长远来看,仅代码的答案是没有用的。
【解决方案2】:

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

<form onSubmit={e => e.preventDefault()}>
    <button onClick={this.handleClick}>Click Me</button>
</form>

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

【讨论】:

    【解决方案3】:

    还有另一个更易于访问的解决方案:不要将操作放在按钮上。表单中已经内置了很多功能。处理表单提交和重置,而不是处理按钮按下。只需将 onSubmit={handleSubmit}onReset={handleReset} 添加到您的 form 元素中即可。

    要停止实际提交,只需在您的函数中包含eventevent.preventDefault(); 以停止默认提交行为。现在,从可访问性的角度来看,您的表单行为正确,并且您正在处理用户可能采取的任何形式的提交。

    【讨论】:

      【解决方案4】:
      componentDidUpdate(){               
          $(".wpcf7-submit").click( function(event) {
              event.preventDefault();
          })
      }
      

      您可以使用componentDidUpdateevent.preventDefault()禁用表单提交。因为react不支持return false。

      【讨论】:

      • 不鼓励在组件内部使用 jQuery,在表单中使用 onSubmit 属性,或者在最坏的情况下使用 ref
      • 不要将 jquery 与 react 一起使用,这是一种非常糟糕的做法
      【解决方案5】:

      真的不需要 JS ... 只需将type 属性添加到值为button 的按钮

      <Button type="button" color="primary" onClick={this.onTestClick}>primary</Button>&nbsp;
      

      默认情况下,按钮元素属于“提交”类型,这会导致它们提交其封闭的表单元素(如果有)。将type 更改为“按钮”可以防止这种情况发生。

      【讨论】:

      • 如果您使用的是表单,这样做将不允许用户按回车键提交表单,我认为这很重要。
      • 感谢您的精彩回答。仅供参考,这是关于此处提到的默认行为的参考:developer.mozilla.org/en-US/docs/Web/HTML/Element/…
      • @StormRage,您知道如何处理您希望表单使用回车键工作的事件(即不使用 onClick 提交按钮),但仍想禁用提交基于状态验证的按钮(例如密码长度)
      • 最好用JS,因为它是JS,涵盖所有场景。
      【解决方案6】:

      preventDefault 是您要查找的内容。只是阻止按钮提交

      <Button onClick={this.onClickButton} ...
      

      代码

      onClickButton (event) {
        event.preventDefault();
      }
      

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

      <form onSubmit={this.onSubmit}>
      

      及以上代码

      onSubmit (event) {
        event.preventDefault();
      
        // custom form handling here
      }
      

      【讨论】:

      • 谢谢! &lt;form onSubmit={e =&gt; { e.preventDefault(); }} &gt; 允许我在表单上有一个提交按钮,但在提交表单时没有页面刷新。
      【解决方案7】:

      您已阻止事件的默认操作并从函数返回false

      function onTestClick(e) {
          e.preventDefault();
          return false;
      }
      

      【讨论】:

        【解决方案8】:

        我认为首先值得注意的是,如果没有 javascript(纯 html),form 元素会在单击 &lt;input type="submit" value="submit form"&gt;&lt;button&gt;submits form too&lt;/button&gt; 时提交。在 javascript 中,您可以通过使用事件处理程序并在按钮单击或表单提交时调用 e.preventDefault() 来防止这种情况发生。 e 是传递给事件处理程序的事件对象。使用 react,两个相关的事件处理程序可以通过onSubmit 的形式获得,另一个在按钮上通过onClick 获得。

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

        【讨论】:

        • +1 这是真的。但请记住,如果您使用e.preventDefault(),您将失去浏览器的原生表单验证。
        • @Sagivb.g 但onSubmit 中的e.preventDefault() 不会禁用本机验证。
        【解决方案9】:

        两种方式

        第一个我们将参数中的事件直接传递给 onClick。

          onTestClick(e) {
            e.preventDefault();
            alert('here');
          }
        

          // Look here we pass the args in the onClick
          <Button color="primary" onClick={e => this.onTestClick(e)}>primary</Button>&nbsp;
        

        第二个我们将它传递给参数,我们在 onClick 中做了正确的

          onTestClick() {
            alert('here');
          }
        

          // 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;
        

        希望能帮到你

        【讨论】:

          【解决方案10】:
          function onTestClick(evt) {
            evt.stopPropagation();
          }
          

          【讨论】:

            【解决方案11】:

            在您的onTestClick 函数中,传入事件参数并对其调用preventDefault()

            function onTestClick(e) {
                e.preventDefault();
            }
            

            【讨论】:

            • 试过了,没用。事实上,当我查看组件的代码时,它已经在这样做了。代码可以看这里:github.com/reactstrap/reactstrap/blob/master/src/Button.js
            • 我将它添加到小提琴中并且效果很好,唯一一次他们为您这样做是如果您在 Button 组件上传入this.props.disabled = true
            猜你喜欢
            • 2017-11-22
            • 2018-11-07
            • 2020-10-06
            • 2016-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多