Два события handleChange с использованием опции множественного выбора в реагировать
Я пытаюсь написать (две) несколько выбранных опций, используя две функции изменения дескриптора, я не думаю, что это не очень хорошая практика, так как в двух выбранных опциях мне приходится связывать эти данные отдельно, не нарушая другие множественные выбранные опции.
import React, { Component } from 'react';
class AddEvent extends Component {
constructor() {
super();
this.state = {
speaker: [''],
hash_tag: ['']
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
var options = event.target.options;
var value = [];
for (var i = 0, l = options.length; i < l; i++) {
if (options[i].selected) {
value.push(options[i].value);
}
}
this.setState({ value: value });
}
handleChange(event2) {
var options2 = event2.target.options;
var value2 = [];
for (var j = 0, l = options2.length; j < l; j++) {
if (options2[j].selected) {
value2.push(options2[j].value);
}
}
this.setState({ value: value2 });
}
render() {
return (
<div className="col-md-12">
<h3>Add Events</h3>
<form onSubmit={this.handleSubmit}>
<div className="col-md-6">
<div className="form-group">
<label>Event Speaker:</label>
<select
data-style="btn-default"
className="form-control"
multiple
data-max-options="3"
value={this.state.value}
onChange={this.handleChange}
>
<option value="Vivek Srinivasan">Vivek Srinivasan</option>
<option value="Salma Moosa">Salma Moosa</option>
<option value="Rengaprasad">Rengaprasad</option>
</select>
</div>
</div>
<div className="col-md-6">
<div className="form-group">
<label>Event Hash Tags:</label>
<select
data-style="btn-default"
className="form-control"
multiple
data-max-options="3"
value={this.state.value}
onChange={this.handleChange2}
>
<option value="hash_tag_1">hash_tag_1</option>
<option value="hash_tag_2">hash_tag_2</option>
<option value="hash_tag_3">hash_tag_3</option>
<option value="hash_tag_4">hash_tag_4</option>
<option value="hash_tag_5">hash_tag_4</option>
</select>
</div>
</div>
<div className="col-md-12">
<div className="form-group">
<label>Event Content</label>
<textarea
id="summernote"
value="Type Here "
onChange={val => this.setState({ content: val.target.value })}
/>
</div>
</div>
<div className="col-md-3">
<button className="btn btn-block btn-primary btn-lg" type="submit">
Save Event
</button>
</div>
</form>
</div>
);
}
}
export default AddEvent;
1 ответ
Я не совсем понимаю, почему вы не хотите использовать разные обработчики для каждого элемента select. Тем более что вы уже написали две функции-обработчика. Возможно, я неправильно понял ваш вопрос.
На мой взгляд, у вас есть три основные проблемы.
1) У вас не может быть двух функций с одинаковым именем, как вы делаете с handleChange.
2) В вашем текущем коде вы ссылаетесь на функцию, которая не существует (handleChange2).
3) В обеих функциях handleChange вы переопределяете свойство value в состоянии с другим, поскольку обе изменяют значение свойства в состоянии.
Переименование последней функции handleChange в handleChange2 решит проблемы 1 и 2.
Третья проблема будет решена наличием двух свойств-значений в вашем состоянии, например, value1 и value2 (хотя я бы предложил использовать более описательные имена).