Способ 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>
);
}
});
источник
select
в один массив? Скажите, после того, как вытащили их все черезdocument.querySelectorAll('select')
?selectedOptions
него не было хорошей совместимости, и он все еще не поддерживается IE. Однако это был бы современный способ сделать это.Так же, как и в любом другом месте, поскольку вы работаете с реальным узлом 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); }
источник
(option.value for option in e.target.options when option.selected)
[...e.target.options].filter(({selected}) => selected).map(({value}) => value)
event.target.options
являетсяHTMLOptionsCollection
массивом, а не массивом.HTMLOptionsCollection
не повторяется. ОднакоArray.from
до сих пор работает с ним:Array.from(event.target.options).filter(o => o.selected).map(o => o.value)
Самый простой способ...
handleChange(evt) { this.setState({multiValue: [...evt.target.selectedOptions].map(o => o.value)}); }
источник
HTMLCollectionOf<HTMLOptionElement>
не массив ...Array.from
Хотя вроде работает. stackoverflow.com/a/49684109/29182Если вы хотите использовать,
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; });
Обновление ES6 2018
let select = this.refs.selectRef; let values = [].filter.call(select.options, o => o.selected).map(o => o.value);
источник
selectedOptions
как не поддерживается в IEЕсли вы хотите отслеживать выбранные параметры во время заполнения формы:
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 (в случае, если вы не фиксируете событие), что было еще одним ответом на вопрос.источник
selectedOptions
кажется довольно отрывочной. Но, наверное, было бы идеальным решением, если бы была поддержка.Вы действительно можете найти
selectedOptions
цель внутри ... нет необходимости перебирать все параметры. Представим, что вы хотите отправить значения вonChange
функции, переданной вашему компоненту в качестве реквизита: вы можете использовать следующую функциюonChange
для вашего множественного выбора.onSelectChange = (e) => { const values = [...e.target.selectedOptions].map(opt => opt.value); this.props.onChange(values); };
источник
selectedOptions
не было хорошей совместимости. Он по-прежнему не поддерживается Internet Explorer, поэтому не может использоваться, если вам нужна поддержка IE (по крайней мере, без полифилла).Следующее сработало для меня
var selectBoxObj = React.findDOMNode(this.refs.selectBox) var values = $(selectBoxObj).val()
источник
Другой способ сделать это:
handleChange({ target }) { this.props.someCallback( Array.prototype.slice.call(target.selectedOptions).map(o => o.value) ) }
источник
Попробуй это:
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>
источник