I tried several solutions to the following forms but had no luck. I want to send the value a radio button back to my Redux store using a function, updateCategory(), passed as a prop, but I can't get the onChange to fire. Also, how would I pass the value of a radio button as a param instead of typing the value out? I.E. this.props.updateCategory('health')
<form className="form-inline my-2 my-lg-0">
<div className="btn-group" data-toggle="buttons">
<label className="btn btn-secondary active">
<input
type="radio"
name="options"
value='health'
checked={false}
onChange={() => this.props.updateCategory('health')} /> Health
</label>
<label className="btn btn-secondary">
<input
type="radio"
name="options"
value='tattoo'
checked={true}
onChange={() => this.props.updateCategory('tattoo')} /> Tattoo
</label>
</div>
</form>
For a radio button, onChange event will trigger for the radio that was previously checked as well as the one that is currently checked. You can do the following to confirm that the correct radio is checked
updateCategory = (e) => {
if(e.target.checked) {
this.props.updateCategory(e.target.value)
}
}
<form className="form-inline my-2 my-lg-0">
<div className="btn-group" data-toggle="buttons">
<label className="btn btn-secondary active">
<input
type="radio"
name="options"
value='health'
defaultChecked
checked={this.props.checked === "health" }
onChange={this.updateCategory} /> Health
</label>
<label className="btn btn-secondary">
<input
type="radio"
name="options"
value='tattoo'
checked={this.props.checked === "tattoo"}
onChange={this.updateCategory} /> Tattoo
</label>
</div>
</form>
Also, you need to make sure that your input is controlled input with the checked value coming from props or state and not a static one, because if you write checked={true}, your radio button will always stay true. You need to store the checked state and then update it like
checked={this.props.checked}
More info about Controlled Components can be found here.
As an alternative, you can also have the input as uncontrolled components and write them like
<form className="form-inline my-2 my-lg-0">
<div className="btn-group" data-toggle="buttons">
<label className="btn btn-secondary active">
<input
type="radio"
name="options"
value='health'
defaultChecked
onChange={this.updateCategory} /> Health
</label>
<label className="btn btn-secondary">
<input
type="radio"
name="options"
value='tattoo'
onChange={this.updateCategory} /> Tattoo
</label>
</div>
</form>
More info about Uncontrolled Components.
DEMO of Uncontrolled input
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With