#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь создать динамическую форму реагирования, в которой пользователи могут выбирать несколько значений из выпадающего меню, которое затем сохраняется. Мне удалось найти этот пример, однако реализация и добавление атрибута multiple, похоже, не работают. Есть идеи? Спасибо.
Ожидаемый результат: пользователь должен иметь возможность выбирать несколько значений, таких как элемент A и Элемент B. Затем они могут добавить еще одну опцию выбора, но на этот раз выберите пункт B, например, с сохранением последних установленных значений.
class App extends React.Component {
constructor(props) {
super(props);
this.state = { values: [] };
this.handleSubmit = this.handleSubmit.bind(this);
}
createUI() {
return this.state.values.map((el, i) => (
<div key={i}>
<select
multiple={true}
value={el || ""}
onChange={this.handleChange.bind(this, i)}
>
<option value="">Select</option>
<option value="10">Item A</option>
<option value="20">Item B</option>
</select>{" "}
<input
type="button"
value="remove"
onClick={this.removeClick.bind(this, i)}
/>
</div>
));
}
handleChange(i, event) {
let values = [...this.state.values];
values[i] = event.target.value;
this.setState({ values });
}
addClick() {
this.setState((prevState) => ({ values: [...prevState.values, ""] }));
}
removeClick(i) {
let values = [...this.state.values];
values.splice(i, 1);
this.setState({ values });
}
handleSubmit(event) {
alert("A name was submitted: " this.state.values.join(", "));
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
{this.createUI()}
<input
type="button"
value="add more"
onClick={this.addClick.bind(this)}
/>
<input type="submit" value="Submit" />
</form>
);
}
}
ReactDOM.render(<App />, document.getElementById("container"));
Ответ №1:
Если я правильно понимаю, вы хотите сделать каждый выбор независимым для каждого поля выбора и должны иметь возможность отправлять его целиком.
вы можете обновить метод handleChange с помощью массива выбранного значения.
handleChange(i, event) {
let values = [...this.state.values];
// change
values[i] = Array.from(
event.target.selectedOptions,
(option) => option.value
);
this.setState({ values });
}
вы можете, следуя этой ссылке на код CodeSandbox
Ответ №2:
Вам нужно сохранить выбранные значения Select
и в value
атрибуте, который вам нужно передать, параметры выбранного значения.
Рабочий пример — ссылка CodeSandbox
Код —
handleChange(i, e) {
let target = e.target;
let name = target.name;
let value = Array.from(target.selectedOptions, (option) => option.value);
this.setState({
[name]: value
});
}
createUI() {
return this.state.values.map((el, i) => (
<div key={i}>
<select
name="selectOptions"
multiple={true}
value={this.state.selectOptions}
onChange={this.handleChange.bind(this, i)}
>
<option value="">Select</option>
<option value="10">Item A</option>
<option value="20">Item B</option>
</select>{" "}
<input
type="button"
value="remove"
onClick={this.removeClick.bind(this, i)}
/>
</div>
));
}
Комментарии:
1. Это изменяет значения для каждого параметра. Я пытаюсь сделать так, чтобы, если вы выберете элементы A и B в первом варианте, а затем выберите элемент B во втором варианте, то оба значения будут сохранены. Похоже, это меняет значения для всех параметров. Спасибо
2. @user14649590: для этого вам нужно изменить массив значений, мой пример предназначен для индивидуального множественного выбора, с помощью этого вы можете расширить его дальше.
Ответ №3:
Единственная проблема, которую я вижу, — это multiple
значение, которое вы установили select
. Вам нужно только установить его true
, когда вы передаете array как value
свойство. Но вы этого не делаете. Так что удалите multiple={true}
, и все готово.
Ваш подход кажется прекрасным. В конце, когда, например, пользователь выбирает A, select, B, this.state.values
будет регистрироваться ["10", "", "20"]
.
P.S: Если вы новый разработчик React и проект новый, я настоятельно рекомендую вам использовать перехватчики реакции и избавиться от всех this
bind
компонентов и классов.