设置为选择框选择了哪个选项的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>
);
}
});
答案 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.slice
和call
允许我们为新状态创建它的副本。你也可以使用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
答案 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);
};