[英]How to setState of single element with onChange method in <select> react?
I have react component with select tag, which is rendered for any item in array (if one value in array, then one select will be on the page, 2 values = select tags), select receive onChange method, and when i changing something in first it's also change the same for every select element.我有带有选择标签的反应组件,它为数组中的任何项目呈现(如果数组中有一个值,那么页面上将有一个选择,2 个值 = 选择标签),选择接收 onChange 方法,当我更改某些内容时首先,它也为每个选择元素更改相同。
How I can apply onChange for a specific element and not for all elements?如何将 onChange 应用于特定元素而不是所有元素?
My code is below:我的代码如下:
options: [
{name: "Change status", value:["Available", "Not Available", "Vacation"]}
]
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
firstname: '',
lastname: '',
status: 'Available',
newstatus: 'Not Available',
hits: [],
isLoading: false,
error: null,
};
this.onChange = this.onChange.bind(this)
this.handleSubmit = this.handleSubmit.bind(this)
this.loadoptions = this.loadoptions.bind(this)
}
onChange (e) {
this.setState({ [e.target.name]: e.target.value });
}
loadoptions = () => {
const OptionsArray = []
let OptionsData = optionsArray.options
OptionsData.forEach((val, index) => {
let OptionsDatavalue = val.value
OptionsArray.push(
<FormControl>
<InputLabel htmlFor="controlled-open-select">{val.status}</InputLabel>
<Select
key={index}
name="newstatus"
value={this.state[val.name] ? this.state[val.name] : ""}
onChange={this.onChange}
inputProps={{ name: val.name }}
>
{OptionsDatavalue.map(option => (
<MenuItem key={option} value={option}>
{option}
</MenuItem>
))}
</Select>
</FormControl>
);
});
return OptionsArray;
};
In render i run:在渲染中我运行:
<form autoComplete="off" className="new_status">
<FormControl>{this.loadoptions()}</FormControl>
</form>
As per your code.根据您的代码。 You have a problem in giving the name to a select.
您在为选择指定名称时遇到问题。
<Select
key={index}
name="newstatus" {// shoule be diffrent for each tag}
value={this.state[val.name] ? this.state[val.name] : ""}
onChange={this.onChange}
inputProps={{ name: val.name }}
>
You can use simply use an Object for options inside the state to make it work.您可以简单地使用对象作为状态内的选项来使其工作。
this.state = {
options: {
change_status1: "Vacation",
change_status2: "Not Available"
}
};
onChange = e => {
let options = this.state.options;
options[e.target.name] = e.target.value;
this.setState({ options }, () => {
console.log("newState", options);
});
};
loadoptions = () => {
const OptionsArray = [];
let OptionsData = _options;
let stateOptions = this.state.options;
OptionsData.forEach((val, index) => {
let OptionsDatavalue = val.value;
let selectName = val.name.split(" ").join("_").toLowerCase();
OptionsArray.push(
<div key={index}>
<label>Select {val.name} </label>
<select
key={index}
name={selectName}
defaultValue={
stateOptions[selectName] ? stateOptions[selectName] : ""
}
onChange={this.onChange}
>
{OptionsDatavalue.map(option => (
<option key={option} value={option}>
{option}
</option>
))}
</select>
</div>
);
});
return OptionsArray;
};
render() {
return <div className="App">{this.loadoptions()}</div>;
}
Here is the fiddle.这是小提琴。
https://codesandbox.io/s/5464pqvyxk https://codesandbox.io/s/5464pqvyxk
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.