У меня есть массив json в формате ниже
this.state = {
allTeachers: [
{
"id": "qKUd5GoBwpolnxM4upjo",
"name": "XYZ",
"subject": "Science"
},
{
"id": "qaUe5GoBwkrtnxM4kOip",
"name": "Vidya",
"subject": "Mathematics"
}
]
}
И я использую приведенный ниже код для раскрывающегося списка. Теперь я могу установить имя, но я хочу показать имя в раскрывающемся списке и установить соответствующий идентификатор выбранного имени. Я использую сборщик реактивов. Как я могу это сделать?
<View style = {styles.dropdownInput}>
{
<Picker
selectedValue = {this.state.teacher_name}
style = {styles.pickerCss}
onValueChange = {(itemValue, itemIndex) => this.setState({teacher_name: itemValue})}
>
<Picker.Item label='Select Teacher' value='0' />
{
this.state.allteachers ?
this.state.allteachers.map((item,key) => (
<Picker.Item label = {item.name} value = {item.name} />
))
:
false
}
</Picker>
}
</View>
Вам просто нужно установить значение PickerItem на соответствующий идентификатор. Это означает изменение:
<Picker.Item label = {item.name} value = {item.name} />
к
<Picker.Item label = {item.name} value = {item.id} />
Сейчас
onValueChange = {(itemValue, itemIndex) => this.setState({teacher_name: itemValue})}
сохраняет teacher_id
в переменной состояния teacher_name
. Вы можете создать новую переменную состояния с именем teacher_id
в своем конструкторе и сохранить там идентификатор.
Кроме того, Я бы рекомендовал небольшой рефакторинг. Вместо:
{
// btw here is a typo your array is called allTeachers
this.state.allteachers ?
this.state.allteachers.map((item,key) => (
<Picker.Item label = {item.name} value = {item.name} />
))
:
false
}
Я бы создал функцию renderPickterItems:
renderPickerItems(allTeachers){
if (allTeachers) {
return(
allTeachers.map((item,key) => (
<Picker.Item label = {item.name} value = {item.id} />
))
);
}
}
который вы можете вызвать с помощью:
<Picker.Item label='Select Teacher' value='0' />
{this.renderPickerItems(this.state.allTeachers)}
</Picker>
Полный рабочий пример: