119

I've been experimenting with React. In my experiement, I'm using the Reactstrap framework.When I click a button, I've noticed that the HTML form submits. Is there a way to prevent form submission when a button is clicked?

I've recreated my issue here. My form is pretty basic and looks like this:

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

What am I missing?

1
  • 4
    Seems related to this. Tried setting the button's type to button? Commented Oct 1, 2016 at 18:14

15 Answers 15

135
+50

I think it's first worth noting that without javascript (plain html), the form element submits when clicking either the <input type="submit" value="submit form"> or <button>submits form too</button>. In javascript you can prevent that by using an event handler and calling e.preventDefault() on button click, or form submit. e is the event object passed into the event handler. With react, the two relevant event handlers are available via the form as onSubmit, and the other on the button via onClick.

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

Sign up to request clarification or add additional context in comments.

3 Comments

+1 This is true. But keep in mind, if you use e.preventDefault() you will loose the native form validation of the browser.
@Sagivb.g But e.preventDefault() in onSubmit won't disable native validation.
...and even if it did, you could use form.reportValidity() to trigger it anyway!
107

No JS needed really ... Just add a type attribute to the button with a value of button

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

By default, button elements are of the type "submit" which causes them to submit their enclosing form element (if any). Changing the type to "button" prevents that.

EDIT: Be careful with this simple solution though, because it will prevent users from submitting the form using the ENTER key as people have mentioned in the comments below.

5 Comments

if you are using a form, doing this won't allow the users to submit the form pressing the enter key, which in my opinion is a big deal.
Thanks for a great answer. FYI, here is a reference about the default behavior mentioned here: developer.mozilla.org/en-US/docs/Web/HTML/Element/…
@StormRage, do you know how to handle events where you'd like the form to work using the enter key (i.e. not using onClick on the submit button), but would still like to disable the submit button based on state validation (password length for example)
Best use is to use JS since it's JS and to cover all scenarios.
My savior! I've read dozens of different pages of results for this question and couldn't find an answer. Turns out my "x" (clear search) button was submitting it when I pressed enter!
44

preventDefault is what you're looking for. To just block the button from submitting

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

code

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

If you have a form which you want to handle in a custom way you can capture a higher level event onSubmit which will also stop that button from submitting.

<form onSubmit={this.onSubmit}>

and above in code

onSubmit (event) {
  event.preventDefault();

  // custom form handling here
}

2 Comments

Thanks! <form onSubmit={e => { e.preventDefault(); }} > allowed me to have a submit button on a form, but not have a page refresh when form was submitted.
Is there a shortcut, like @submit.prevent in Vue?
20

Make sure you put the onSubmit attribute on the form not the button in case you have a from.

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

Make sure to change the button onClick attribute to your custom function.

1 Comment

This won't allow the form to be submitted by pressing Enter. You're better off removing the button's onClick handler completely (causing the button to submit the form) and putting your handler on the onSubmit event instead, ensuring you keep the preventDefault() call in your handler to stop the old-style form submission.
8

2 ways

First one we pass the event in the argument right into the 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;

Second one we pass it into argument and we did right in the 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;

Hope that can help

Comments

4

In your onTestClick function, pass in the event argument and call preventDefault() on it.

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

2 Comments

Tried that and it did not work. In fact, when I look at the component's code, it's already doing that. The code can be seen here: github.com/reactstrap/reactstrap/blob/master/src/Button.js
I added that to the fiddle and it worked fine, the only time they are doing that for you is if you passed in this.props.disabled = true on the Button component
4
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;

1 Comment

This question already contains multiple answers and an accepted answer. Can you explain (by editing your answer) where your answer differs from the other answers? Also know that Code-only answers are not useful in the long run.
3

You have prevent the default action of the event and return false from the function.

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

Comments

3

There's another, more accessible solution: Don't put the action on your buttons. There's a lot of functionality built into forms already. Instead of handling button presses, handle form submissions and resets. Simply add onSubmit={handleSubmit} and onReset={handleReset} to your form elements.

To stop the actual submission just include event in your function and an event.preventDefault(); to stop the default submission behavior. Now your form behaves correctly from an accessibility standpoint and you're handling any form of submission the user might take.

Comments

2
function onTestClick(evt) {
  evt.stopPropagation();
}

Comments

1
import React from 'react'
import Button from './button'
import Input from './input'

function Form(){

    function handleSubmit(event){
        event.preventDefault();
    }

    return(
        <div>
            <h1>FORM</h1>
            <form onSubmit={handleSubmit}>
                <Input type = 'text' placeholder = "What's Your Name?" />
                <Button buttonText = 'Submit' />
            </form>
        </div>
    );
}

export default Form;

Comments

1

I was facing this problem when I used preventDefault() with destructuring. It worked perfectly fine without destructuring:

// this works
const handleClick = (evt) => {
   evt.preventDefault();
}

// this doesn't work
const handleClick = ({preventDefault}) => {
   preventDefault();
}

Comments

0

In my case, I had done a typing error - used onClick in place of onSubmit.

Make sure you use onSubmit event handler and not onClick on the form element.

Comments

-1
<button type="submit" onClick={(e)=> this.submitInfo(e)}>Prevent Submit</button>

And the function

submitInfo = (event)=>{
    event.preventDefault();
      .....

}

Comments

-8
componentDidUpdate(){               
    $(".wpcf7-submit").click( function(event) {
        event.preventDefault();
    })
}

You can use componentDidUpdate and event.preventDefault() to disable form submission.As react does not support return false.

2 Comments

Is discouraged to use jQuery like that inside a component, use the onSubmit attribute in the form, or ref in the worst case scenario
don't use jquery with react, is a very bad practice

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.