2015-06-09 6 views
1
<Multiselect label='Select College' ref="collegeList" onChange={this.handleChange} multiple > 
     <option value='college1'>college1</option> 
     <option value='college2'>college2</option> 
</Multiselect> 

Этот компонент из https://github.com/skratchdot/react-bootstrap-multiselectКак получить несколько значений выбранных опций в React JS?

Что должно быть написано внутри функции handleChange()?

+0

Вы можете попытаться сделать 'handleChange: функция (событие) {console.log (событие); } 'и посмотреть, записывает ли он что-нибудь? – gcedo

+0

ya Я проверил его, но не знаю, какое поле искать, чтобы получить выбранные элементы. – bunty93

+0

На самом деле из 'onChange' вы получаете сам элемент, на который нажимаете, и логическое значение, true, если элемент был проверен, в противном случае - false. Ниже вы найдете мой полный ответ. – gcedo

ответ

4

К сожалению, react-bootstrap-multiselect, похоже, не предоставляет какой-либо API для получения выбранных в данный момент элементов, поэтому вам придется запрашивать их непосредственно из DOM. Попробуйте что-то вроде этого:

handleChange: function() { 
    var node = React.findDOMNode(this.refs.collegeList); 
    var options = [].slice.call(node.querySelectorAll('option')); 
    var selected = options.filter(function (option) { 
     return option.selected; 
    }); 
    var selectedValues = selected.map(function (option) { 
     return option.value; 
    }); 

    console.log(selectedValues); 
} 

Если вы используете JQuery, это может быть немного упрощен, чтобы:

handleChange: function() { 
    var node = $(React.findDOMNode(this.refs.collegeList)); 
    var selectedValues = node.children('option:selected').map(function(option) { 
     return option.value; 
    }); 

    console.log(selectedValues); 
} 
2

Я хотел бы предложить, чтобы государство в компоненте под названием selectedItems

Затем обратный вызов onChange принимает в качестве параметров element и checked, от Bootstrap Multiselect docs. Элемент имеет метод val(), который возвращает значение, присвоенное этому параметру.

Поэтому handleChange может быть реализована следующим образом

handleChange: function (element, checked) { 
    var newSelectItems = _.extend({}, this.state.selectItems); 
    newSelectItems[element.val()] = checked; 
    this.setState({selectItems: newSelectItems}) 
}, 
getInitialState: function() { 
    return {selectItems: {}}; 
} 

Таким образом, каждый раз, когда элемент щелкают, его атрибут checked сохраняется в компоненте состояния, что весьма удобно, если вам нужно изменить что-либо, основанное на выбранных значениях MultiSelect.

Обратите внимание, что для вышеуказанного кода вам необходимо либо Underscore, либо Lodash. Это необходимо, так как React не может объединить вложенные объекты, как ответ here.

5

Вот намного чище, ES6 способ сделать это :)

let selected = [...this.refs.select] 
    .filter(option => option.selected) 
    .map(option => option.value) 

Там вы идете, все выбранные варианты!

+0

Или вместо '[... this.refs.select]' вы можете сделать 'Array.from (this.refs.select)' – Idefixx

0

Намного проще и прямой путь, чтобы получить значения:

handleChange: function() { 
    var selectedValues = this.refs.collegeList.$multiselect.val(); 
    console.log(selectedValues); 
} 
Смежные вопросы