I am trying to pass the selected value of a <select> in the onChange function.
I have tried this SO Question, but this and this.value don't work. I know the question is kinda old...
setShippingMethod(obj) {
console.log('Shipping method ' + JSON.stringify(obj));
this.state.defaultMethod = obj.value;
this.props.setShippingMethod(obj.value);
}
render() {
const shippingMethods = this.state.shippingMethods;
const defaultMethod = this.state.defaultMethod;
return (
<aside id="checkout" className="block col-1">
<h1>Shipping</h1>
<div className="row">
<select id="comboMethod" onChange={setShippingMethod(this)} value={!!defaultMethod ? null : defaultMethod.trim()}>
{shippingMethods.map(method => { return <option key={method.shipmthd.trim()} value={method.shipmthd.trim()}>{method.shipmthd.trim()}</option>} )}
</select>
</div>
</aside>
);
}
My line console.log('Shipping method ' + JSON.stringify(obj)) generates an error "Uncaught TypeError: cyclic object value" and the message seems to be this still refers to the entire (in my case) modal. Is there a newer way to do this? Any help will be appreciated.
When using events Listeners in react, you get an event object. Their You can access the value that entered to the element with e.target.value.
setShippingMethod(e) {
console.log('Shipping method ' + JSON.stringify(e.target.value));
//...rest of the code
}
render() {
const shippingMethods = this.state.shippingMethods;
const defaultMethod = this.state.defaultMethod;
return (
<aside id="checkout" className="block col-1">
<h1>Shipping</h1>
<div className="row">
<select id="comboMethod" onChange={setShippingMethod} value={!!defaultMethod ? null : defaultMethod.trim()}>
{shippingMethods.map(method => { return <option key={method.shipmthd.trim()} value={method.shipmthd.trim()}>{method.shipmthd.trim()}</option>} )}
</select>
</div>
</aside>
);
}
this is always going to be a reference to the class while you are in class. if you want to pass the selected option value you need something like
onChange={(e) => {setShippingMethod(e.target.value)}}