Я пытаюсь динамически визуализировать форму, используя цикл «для», и она хорошо отображается, но когда я попытался изменить значение в средстве выбора, оно изменилось, но сразу же изменилось на значение по умолчанию, так что мне нужно сделать, чтобы исправить это?
class Datos extends Component {
cotizadorData: any;
planesData: any;
dataStructure =
{
id: 1,
name: '',
lastName: '',
email: '',
documentNumber: '',
dateOfBirth: '',
age: '',
gender: 'M',
areaCode: '',
phoneNumber: '',
medicalObservation: 'Sin Observaciones'
};
emergencyContactDataStructure =
{
name: '',
email: '',
areaCode: '',
phoneNumber: ''
};
planCode: string = '';
departurePlaceCode: string = '';
arrivalPlaceCode: string = '';
passengersArray: Array = [];
additionalPassengersCount: number = 0;
additionalPassengersArray: Array = [];
additionalPassengersView: Array = [];
__isMounted: string = 'false';
mainPassengerAreaCodeRef: any;
emergencyContactAreaCodeRef: any;
apiKey: string = '';
xmlForOrder: string = '';
constructor(){
super();
this.state = {
showLoader: false,
countries : [ {
label: '',
value: ''
} ],
holderData: this.dataStructure,
additionalPassengers: [],
additionalPassengersView: [],
emergencyContact: this.emergencyContactDataStructure
};
}
async componentDidMount () : void {
this.setState({
showLoader: true
});
await AsyncStorage.setItem('dataComponentIsMounted', 'true');
this.apiKey = await AsyncStorage.getItem('apiKey');
this.xmlForCountries = getCountries(this.apiKey);
this.countries = await getOrbisDataServer(this.xmlForCountries);
this.processCotizadorData();
this.setState({
departurePlace: this.countries[0].description
});
this.formatArraysForPickers();
};
updateAsyncStorage = async() => {
this.__isMounted = await AsyncStorage.getItem('dataComponentIsMounted');
if (!isUndefinedOrNull(this.__isMounted))
{
if (this.__isMounted === 'true')
{
this.processCotizadorData();
}
}
};
processCotizadorData = async() => {
this.additionalPassengersCount = 0;
this.additionalPassengersArray = [];
this.cotizadorData = await AsyncStorage.getItem('cotizadorData');
this.planesData = JSON.parse(await AsyncStorage.getItem('planesData'));
if (!isUndefinedOrNull(this.cotizadorData))
{
this.cotizadorData = JSON.parse(this.cotizadorData);
this.additionalPassengersCount = (this.cotizadorData.youngs + this.cotizadorData.adults +
this.cotizadorData.semiSeniors + this.cotizadorData.seniors) - 1;
let id = 2;
for(let i = 0; i < this.additionalPassengersCount; i++)
{
this.additionalPassengersArray.push({
id: id,
name: '',
lastName: '',
email: '',
documentNumber: '',
dateOfBirth: '',
age: '',
gender: 'M',
areaCode: '',
phoneNumber: '',
medicalObservation: 'Sin Observaciones'
});
id++;
}
this.setState({
additionalPassengers: this.additionalPassengersArray
});
this.renderAdditionalPassengersForms();
}
};
setAdditionalPassengerGender = (additionalPassenger, value) => {
let additionalPassengersModified = [...this.state.additionalPassengers];
let index = additionalPassengersModified.findIndex(el => el.id === additionalPassenger.id);
additionalPassengersModified[index] = {...additionalPassengersModified[index], gender: value};
this.setState({
additionalPassengers: additionalPassengersModified
});
};
renderAdditionalPassengersForms = () => {
for(let i = 0; i < this.additionalPassengersArray.length; i++)
{
this.additionalPassengersView.push(
<View>
<Text style = {[styles.normalFont, styles.label]}>SEX</Text>
<Picker
selectedValue = {this.state.additionalPassengers[i].gender}
style = {{height: 50, width: 100}}
onValueChange = {(value) => {this.setAdditionalPassengerGender (this.additionalPassengersArray[i], value)}}>
<Picker.Item label = "Male" value = "M"/>
<Picker.Item label = "Female" value = "F"/>
</Picker>
</View>
)
}this.setState({
additionalPassengersView: this.additionalPassengersView
});
}
Я ожидаю изменить значение выбора для выбранного.
Отредактировано: я добавил весь компонент
@ViniciusCleves спасибо за ответ, но это не сработало, значение по умолчанию для средства выбора пола — «Мужской», когда я пытаюсь изменить на «Женский», оно меняется, но через секунду снова меняется на значение по умолчанию.
Можете ли вы поделиться всем компонентом?
@ViniciusCleves уже сделал это
Я не знаком с вашей структурой компонентов. Где твоя функция render?
@ViniciusCleves мои функции рендеринга просто рендерят всю форму только для 1 пассажира, дополнительный пассажир, который рендерится динамически, называется так { this.state.additionalPassengersView }





Поскольку у вашего пользовательского интерфейса нет проблем с накоплением просмотров на this.additionalPassengersView, я полагаю, renderAdditionalPassengersForms не вызывается каждый раз, когда изменяется значение в любом из дополнительных средств выбора пассажиров.
Ваша проблема: selectedValue в Picker нужно обновлять, когда вы делаете выбор. В противном случае средство выбора вернется к своему не обновленному выбранному значению, как описано вами.
Я использую redux-form для управления своими формами. Но, предполагая, что вы не хотите его использовать, вы можете создать новый компонент для средства выбора, поместив выбранное значение средства выбора в состояние и обновив это состояние при обратном вызове onValueChange.
Кажется, это проблема, теперь она решена, спасибо за ваше время. Я боролся с этим.
Единственная необычная вещь, которую я могу найти в вашем коде, это
this.additionalPassengersView.push. Вы очищаете это имущество где-нибудь? Потому что в противном случае он будет просто помещать объекты в массив каждый раз, когда вызывается renderAdditionalPassengersForms, в то время как я думаю, что ожидаемое поведение должно заключаться в том, чтоthis.additionalPassengersViewсодержит только те объекты, которые должны быть показаны.