'React - Preventing Form Submission
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>
</p>
</Form>
What am I missing?
Solution 1:[1]
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>
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.
Solution 2:[2]
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
}
Solution 3:[3]
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.
Solution 4:[4]
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>
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>
Hope that can help
Solution 5:[5]
In your onTestClick function, pass in the event argument and call preventDefault() on it.
function onTestClick(e) {
e.preventDefault();
}
Solution 6:[6]
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.
Solution 7:[7]
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;
Solution 8:[8]
function onTestClick(evt) {
evt.stopPropagation();
}
Solution 9:[9]
You have prevent the default action of the event and return false from the function.
function onTestClick(e) {
e.preventDefault();
return false;
}
Solution 10:[10]
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;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Pawel |
| Solution 3 | Community |
| Solution 4 | |
| Solution 5 | Soviut |
| Solution 6 | dougoftheabaci |
| Solution 7 | |
| Solution 8 | fvgs |
| Solution 9 | Gokhan Kurt |
| Solution 10 |
