Я придумал решение, которое не использует JSON.stringify/parse для значения элемента Select React и не использует индекс массива объектов выбора в качестве значения.
Примером является простое раскрывающееся меню для пола человека - мужчины или женщины. Каждый из этих вариантов является фактическим объектом с идентификационными, текстовыми и значениями. Вот код:
MySelect компонент
import React, { Component } from 'react';
class MySelect extends Component {
onGenderChange = (event) => {
// Add the second argument -- the data -- and pass it along
// to parent component's onChange function
const data = { options: this.props.options };
this.props.onGenderChange(event, data);
}
render() {
const { options, selectedOption } = this.props;
// Goes through the array of option objects and create an <option> element for each
const selectOptions = options.map(
option => <option key={option.id} value={option.value}>{option.text}</option>
);
// Note that if the selectedOption is not given (i.e. is null),
// we assign a default value being the first option provided
return (
<select
value={(selectedOption && selectedOption.value) || options[0].value}
onChange={this.onGenderChange}
>
{selectOptions}
</select>
);
}
}
App компонент, который использует MySelect
import _ from 'lodash';
import React, { Component } from 'react';
class App extends Component {
state = {
selected: null
}
onGenderChange = (event, data) => {
// The value of the selected option
console.log(event.target.value);
// The object for the selected option
const selectedOption = _.find(data.options, { value: parseInt(event.target.value, 10) });
console.log(selectedOption);
this.setState({
selected: selectedOption
});
}
render() {
const options = [
{
id: 1,
text: 'male',
value: 123456
},
{
id: 2,
text: 'female',
value: 654321
}
];
return (
<div>
<label>Select a Gender:</label>
<MySelect
options={options}
selectedOption={this.state.selected}
onGenderChange={this.onGenderChange}
/>
</div>
);
}
}
Lodash используется для просмотра объекта выбора в массиве выбор объектов внутри функция onGenderChange
в компоненте приложения. Обратите внимание, что для параметра onChange, переданного компоненту MySelect
, требуются два аргумента - добавляется дополнительный аргумент данных, чтобы иметь доступ к объектам выбора («параметры»). При этом вы можете просто установить состояние (или вызвать создателя действия при использовании Redux) с объектом выбора для выбранного параметра.
Проверьте 'реакция-выберите'. Вы также можете создать массив 'select', чтобы быть дочерними элементами элемента 'option'. –
@Andy_D благодарит за предложение. Я фактически использую Semantic UI React (http://react.semantic-ui.com/modules/dropdown), и проблема заключается в том, что значение каждой опции может быть только строкой. Я как-то нашел способ обойти это, строя объект в значение. Я посмотрел исходный код для реакции-select, и они это делают. Дело в том, что я должен разбираться в JSON для каждой функции обмена, которую я имею. Мне было интересно, есть ли лучший подход. Другая идея заключается в использовании индекса массива в качестве значения и доступа ко всем параметрам, а затем сужения с помощью индекса. – nbkhope