Получение значения из <select> с несколькими параметрами в React
Способ React, чтобы указать, какой параметр выбран для окна выбора, заключается в установке специального атрибута value
для самого <select>
, соответствующего атрибуту value
в элементе <option>
, который вы хотите выбран. Для параметра multiple
этот атрибут может принимать массив. ( Изменить: В настоящее время документация, похоже, удалила ссылку на это)
Теперь, потому что это особый атрибут, мне интересно, каков канонический способ получить выбранные параметры в той же структуре массива-параметра-значения, когда пользователь меняет вещи (поэтому я могу передать его через обратный вызов родительского компонента и т.д.), так как предположительно одно и то же свойство value
не будет доступно в элементе DOM.
Чтобы использовать пример, с текстовым полем вы сделаете что-то вроде этого (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>
);
}
});
Ответы
Ответ 1
Точно так же, как и в других местах, поскольку вы работаете с реальным DOM node в качестве объекта события изменения:
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);
}
Ответ 2
Если вы хотите использовать ref
, вы можете получить выбранные значения следующим образом:
var select = React.findDOMNode(this.refs.selectRef);
var values = [].filter.call(select.options, function (o) {
return o.selected;
}).map(function (o) {
return o.value;
});
Ответ 3
В случае, если вы хотите отслеживать выбранные параметры во время заполнения формы:
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 (в случае, если вы не захватили событие), что было другим ответом на вопрос.
Ответ 4
Следующие работали для меня
var selectBoxObj = React.findDOMNode(this.refs.selectBox)
var values = $(selectBoxObj).val()
Ответ 5
Самый простой способ...
handleChange(evt) {
this.setState({multiValue: [...evt.target.selectedOptions].map(o => o.value)});
}
Ответ 6
Другой способ сделать это:
handleChange({ target }) {
this.props.someCallback(
Array.prototype.slice.call(target.selectedOptions).map(o => o.value)
)
}