在 React 中,你如何处理几个 select 下拉列表的 onChange

In React how do you handle the onChange of several select dropdowns

我有一个表单,其中有几个 select 作为 Dropdown 组件,我希望 onChange 处理程序单独处理它们。我该怎么做?

Dropdown 是根据数据库中的问题数量动态生成的,因此为每个 Dropdown(例如 30 个问题)编写一个 onChange 处理程序是荒谬的)

组件

const Dropdown = props => {
  const { title, id, onChange, noSelection, options, value } = props;

  return (
    <div className="form-group">
      <label className="control-label" htmlFor={id}>
        {title}
      </label>
      <select
        className="form-control"
        name={id}
        id={id}
        onChange={onChange}
        value={value}
      >
        {noSelection && <option defaultValue="" />}
        {options.map(option => (
          <option value={option} key={option}>{option}</option>
        ))}
      </select>
    </div>
  );
};

export default Dropdown;
class Form extends Component {
  constructor() {
    super();
    this.state = {
      noSelection: true,
      value,
    };

    this.handleSelect = this.handleSelect.bind(this);
  }

  handleSelect(event) {
    let target = event.target;
    let value = target.value;

    this.setState({
      noSelection: !this.state.noSelection,
      value,
    });
  }

  render() {
    return (
      <div className="care-sub">
        <Dropdown
          title="Are a developer wanting to become a programmer?"
          id="select-care-leaver"
          onChange={this.handleSelect}
          noSelection={this.state.noSelection}
          options={['Yes', 'No']}
          value={this.state.value}
        />

        <Dropdown
          title="Do you have experience with React"
          id="select-care-estranged"
          onChange={this.handleSelect}
          noSelection={this.state.noSelection}
          options={['Yes', 'No']}
          value={this.state.value}
        />
      </div>
    );  
  }
}

export default Form

我希望每个 DropdownonChange 在用户与它们交互时单独地 Dropdowns 并且不为每个 Dropdowns 编写重复的处理程序。

对于字段的动态处理,我通常给字段起一个名字,并用以下方式处理onChange:

this.setState({
    formData: {
        ...this.state.formData,
        [event.target.name]: event.target.value,
    },
}

只要您使用这些名称呈现选择,并从状态中分配它们的值,一切都会正常工作。

注意 - 我将它保存在一个对象中,因此我可以使用 this.state.formData.

一次获取所有表单数据

您可以将同一个 onChange 处理程序分配给多个字段,它们都会起作用。 (注意,这也适用于输入字段,以及任何使用 .value 的内容)

您的 Dropdown 是时候从功能组件发展为 react 组件了。由于您正在重新使用 Dropdown 组件,因此您只需要为它创建一次 onChange 处理程序作为 Dropdown.

的成员函数

然后,每次 Dropdown 渲染时,它将在不同的 this 上下文中使用相同的成员函数。

像这样:

class Dropdown extends React.Component{
    onChange (e) {
        //do something based on props and value
    }

    render(){
    const { title, id, noSelection, options, value } = this.props;

    return (
        <div className="form-group">
        <label className="control-label" htmlFor={id}>
            {title}
        </label>
        <select
            className="form-control"
            name={id}
            id={id}
            onChange={this.onChange} // use the member function here
            value={value}
        >
            {noSelection && <option defaultValue="" />}
            {options.map(option => (
            <option value={option} key={option}>{option}</option>
            ))}
        </select>
        </div>
    );
    }
};

export default Dropdown;