简体   繁体   English

如何使用 onChange 方法设置单个元素的状态<select>反应?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM