在React </select>中使用多个选项从<select>中检索值

时间:2015-02-20 08:43:29

标签: javascript dom reactjs

设置为选择框选择了哪个选项的React方法是在value上设置一个特殊的<select>道具,对应value上的<option>属性1}}你希望被选中的元素。对于multiple选择,此prop可以接受数组。 (编辑:目前文档似乎已删除对此的引用)

现在因为这是一个特殊属性,我想知道当用户改变事物时,检索相同数组选项 - 值结构中所选选项的规范方法是什么(所以我可以通过回调传递给父组件等),因为可能在DOM元素上没有相同的value属性。

要使用示例,使用文本字段,您可以执行类似这样的操作(JSX):

var TextComponent = React.createClass({
  handleChange: function(e) {
    var newText = e.target.value;
    this.props.someCallbackFromParent(newText);
  },
  render: function() {
    return <input type="text" value={this.props.someText} onChange={this.handleChange} />;
  }
});

对于此多重选择组件,替换???的等价物是什么?

var MultiSelectComponent = React.createClass({
  handleChange: function(e) {
    var newArrayOfSelectedOptionValues = ???;
    this.props.someCallbackFromParent(newArrayOfSelectedOptionValues);
  },
  render: function() {
    return (
      <select multiple={true} value={this.props.arrayOfOptionValues} onChange={this.handleChange}>
        <option value={1}>First option</option>
        <option value={2}>Second option</option>
        <option value={3}>Third option</option>
      </select>
    );
  }
});

9 个答案:

答案 0 :(得分:79)

与其他任何地方一样,因为您正在使用真正的DOM节点作为更改事件的目标:

handleChange: function(e) {
  var options = e.target.options;
  var value = [];
  for (var i = 0, l = options.length; i < l; i++) {
    if (options[i].selected) {
      value.push(options[i].value);
    }
  }
  this.props.someCallback(value);
}

答案 1 :(得分:11)

如果您想使用type,您可以获得如下所选的值:

text/javascript

2018 ES6 更新

ref

答案 2 :(得分:8)

如果您希望在表单完成时跟踪所选选项:

handleChange(e) {
    // assuming you initialized the default state to hold selected values
    this.setState({
        selected:[].slice.call(e.target.selectedOptions).map(o => {
            return o.value;
        });
    });
}

selectedOptions是一个类似于数组的集合/与DOM相关的元素列表。选择选项值时,可以在事件目标对象中访问它。 Array.prototype.slicecall允许我们为新状态创建它的副本。你也可以使用ref访问这些值(如果你没有捕获事件),这是问题的另一个答案。

答案 3 :(得分:7)

最简单的方式......

handleChange(evt) {
  this.setState({multiValue: [...evt.target.selectedOptions].map(o => o.value)}); 
}

答案 4 :(得分:3)

以下为我工作

var selectBoxObj = React.findDOMNode(this.refs.selectBox)
var values = $(selectBoxObj).val()

答案 5 :(得分:2)

使用Array.from()e.target.selectedOptions,您可以执行受控制的选择倍数:

handleChange = (e) => {
  let value = Array.from(e.target.selectedOptions, option => option.value);
  this.setState({values: value});
}

target.selectedOptions返回HTMLCollection

https://codepen.io/papawa/pen/XExeZY

答案 6 :(得分:1)

另一种方法:

handleChange({ target }) {
    this.props.someCallback(
       Array.prototype.slice.call(target.selectedOptions).map(o => o.value)
    )
}

答案 7 :(得分:0)

试试这个:

dropdownChanged = (event) => {
    let obj = JSON.parse(event.target.value);
    this.setState(
        {
            key: obj.key,
            selectedName: obj.name,
            type: obj.type
        });
}


<select onChange={this.dropdownChanged} >
<option value={JSON.stringify({ name: 'name', key: 'key', type: "ALL" })} >All Projetcs and Spaces</option></select>

答案 8 :(得分:0)

您实际上可以在目标内部找到selectedOptions,而无需遍历所有选项。假设您想将值发送到作为道具传递给组件的onChange函数:您可以在多选onChange上使用以下函数。

onSelectChange = (e) => {
    const values = [...e.target.selectedOptions].map(opt => opt.value);
    this.props.onChange(values);
  };