Подтвердить что ты не робот

Получение значения из <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>
    );
  }
});
4b9b3361

Ответ 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)
    )
}