Reputation: 12084
I'm trying to change the value of the checkbox with the onChange
function of another input field.
I have something like this:
class price extends React.Component {
constructor(props) {
super(props);
this.state = {
minValue: 0,
maxValue: 20000,
step: 1000,
firstValue: null,
secondValue: null,
chcboxValue: false
};
this.handleChange = this.handleChange.bind(this);
}
componentWillMount() {
this.setState({firstValue: this.state.minValue, secondValue: this.state.maxValue});
}
handleChange(name, event) {
let value = event.target.value;
// We set the state value depending on input that is clicked
if(name === "second") {
if(parseInt(this.state.firstValue) < parseInt(value)) {
this.setState({secondValue:value});
}
} else {
// The first value can't be greater than the second value
if(parseInt(value) < parseInt(this.state.secondValue)) {
this.setState({firstValue: value});
}
}
// We set the checkbox value
if(parseInt(this.state.firstValue) != parseInt(this.state.minValue) || parseInt(this.state.secondValue) != parseInt(this.state.maxValue)) {
this.setState({chcboxValue: true});
} else {
this.setState({chcboxValue: false});
}
}
render() {
const language = this.props.language;
return (
<div>
<div className="priceTitle">{language.price}</div>
<InputRange language={language}
firstValue={parseInt(this.state.firstValue)}
secondValue={parseInt(this.state.secondValue)}
minValue={parseInt(this.state.minValue)}
maxValue={parseInt(this.state.maxValue)}
step={parseInt(this.state.step)}
handleChange={this.handleChange}
chcboxValue={this.state.chcboxValue}/>
</div>
);
}
}
My InputRange
component is something like this:
const inputRange = ({language, firstValue, secondValue, minValue, maxValue, step, handleChange, chcboxValue}) => {
return (
<div>
<div className="rangeValues">Range : {firstValue} - {secondValue}</div>
<section className="range-slider">
<input type="checkbox" checked={chcboxValue} />
<input type="range" value={firstValue} min={minValue} max={maxValue} step={step} onChange={handleChange.bind(this, "first")} />
<input type="range" value={secondValue} min={minValue} max={maxValue} step={step} onChange={handleChange.bind(this, "second")} />
<div className="minValue">{minValue}</div>
<div className="maxValue">{maxValue}</div>
</section>
</div>
);
};
The checkbox value on initial load is set to false. When the user changes the value of the price range slider, I want that the checkbox value to change to true.
When the user changes the value of the price range slider to their initial values (min and max values), I want the checkbox value to again change to false.
It isn't working in my example.
Any ideas?
Upvotes: 25
Views: 115900
Reputation: 426
we can set an onChange
prop on the input
field and handle the event.
App.js
import {useState} from 'react';
export default function App() {
const [isChecked, setIsChecked] = useState(false);
const handleChange = event => {
setIsChecked(event.target.checked);
// 👇️ this is the checkbox itself
console.log(event.target);
// 👇️ this is the checked value of the field
console.log(event.target.checked);
};
return (
<div>
<input
type="checkbox"
id="checkbox-id"
name="checkbox-name"
onChange={handleChange}
checked={isChecked}
/>
</div>
);
}
Upvotes: 11
Reputation: 1871
This is kind of old but in case it helps.
I started relying on this syntax
Declare in the class, a variable to store the state:
const [agreeToAllTerms, setAgreeToAllTerms] = useState(false);
Declare the checkbox
<Checkbox checked={agreeToAllTerms} onChange={(event)=> {handleChangeChk(event)}}/>
And then in the function checked the current state of the checkbox like this.
const handleChangeChk = (chkValue) => {
setAgreeToAllTerms(chkValue.target.checked);
}
Upvotes: 2
Reputation: 523
you shoud know how we can bind html input value in react. here this example for beginer. easy to understand
const chk= true
chkchk() ={ console.log("checkbox event fire")}
<input name="abc"
type="checkbox" checked={chk.toString()}
onChange={chkchk}
/>
Upvotes: 1
Reputation: 1208
Here is a generic form change handler that also supports checkboxes
onFormChange: (e) => {
// In my example all form values are stored in a state property 'model'
let model = this.state.model;
if(e.target.type == 'checkbox') {
if(model[e.target.name] === false) {
model[e.target.name] = true;
} else if(model[e.target.name] === true) {
model[e.target.name] = false;
} else {
// if the property has not be defined yet it should be true
model[e.target.name] = true;
}
} else {
model[e.target.name] = e.target.value;
}
// Update the state
this.setState({
model: model
});
}
Upvotes: 1
Reputation: 541
not sure but try it :
React.createElement('input',{type: 'checkbox', defaultChecked: false});
or
<input type="checkbox" checked={this.state.chkbox} onChange={this.handleChangeChk} />
or
var Checkbox = React.createClass({
getInitialState: function() {
return {
isChecked: true
};
},
toggleChange: function() {
this.setState({
isChecked: !this.state.isChecked // flip boolean value
}, function() {
console.log(this.state);
}.bind(this));
},
render: function() {
return (
<label>
<input
type="checkbox"
checked={this.state.isChecked}
onChange={this.toggleChange} />
Check Me!
</label>
);
}
});
React.render(<Checkbox />, document.getElementById('checkbox'));
Upvotes: 13
Reputation: 28397
Your example is not working properly because you are checking the value before this.setState()
is completed. Don't forget that this.setState()
does not immediately mutate the state
.
To fix it, you can create a function where you update the value of the checkbox
updateCheckBox(){
if(parseInt(this.state.firstValue) != parseInt(this.state.minValue) || parseInt(this.state.secondValue) != parseInt(this.state.maxValue)){
this.setState({chcboxValue: true});
}else{
this.setState({chcboxValue: false});
}
}
and then pass it to your handleChange
this.setState()
calls.
handleChange(name, event){
let value = event.target.value;
//We set the state value depending on input that is clicked
if(name === "second"){
if(parseInt(this.state.firstValue) < parseInt(value)){
this.setState({secondValue:value}, this.updateCheckBox);
}
}else{
//The first value can't be greater than the second value
if(parseInt(value) < parseInt(this.state.secondValue)) {
this.setState({firstValue: value}, this.updateCheckBox);
}
}
Upvotes: 6