Когда я вызываю setstate в сборщике, он меняет значение два раза

Я пытаюсь динамически визуализировать форму, используя цикл «для», и она хорошо отображается, но когда я попытался изменить значение в средстве выбора, оно изменилось, но сразу же изменилось на значение по умолчанию, так что мне нужно сделать, чтобы исправить это?

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
        });

}

Я ожидаю изменить значение выбора для выбранного.

Отредактировано: я добавил весь компонент

Единственная необычная вещь, которую я могу найти в вашем коде, это this.additionalPassengersView.push. Вы очищаете это имущество где-нибудь? Потому что в противном случае он будет просто помещать объекты в массив каждый раз, когда вызывается renderAdditionalPassengersForms, в то время как я думаю, что ожидаемое поведение должно заключаться в том, что this.additionalPassengersView содержит только те объекты, которые должны быть показаны.

Vinicius 27.05.2019 16:07

@ViniciusCleves спасибо за ответ, но это не сработало, значение по умолчанию для средства выбора пола — «Мужской», когда я пытаюсь изменить на «Женский», оно меняется, но через секунду снова меняется на значение по умолчанию.

Jesus Gonzalez 27.05.2019 21:22

Можете ли вы поделиться всем компонентом?

Vinicius 27.05.2019 21:42

@ViniciusCleves уже сделал это

Jesus Gonzalez 27.05.2019 22:18

Я не знаком с вашей структурой компонентов. Где твоя функция render?

Vinicius 28.05.2019 03:23

@ViniciusCleves мои функции рендеринга просто рендерят всю форму только для 1 пассажира, дополнительный пассажир, который рендерится динамически, называется так { this.state.additionalPassengersView }

Jesus Gonzalez 28.05.2019 04:38
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
6
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку у вашего пользовательского интерфейса нет проблем с накоплением просмотров на this.additionalPassengersView, я полагаю, renderAdditionalPassengersForms не вызывается каждый раз, когда изменяется значение в любом из дополнительных средств выбора пассажиров.

Ваша проблема: selectedValue в Picker нужно обновлять, когда вы делаете выбор. В противном случае средство выбора вернется к своему не обновленному выбранному значению, как описано вами.

Я использую redux-form для управления своими формами. Но, предполагая, что вы не хотите его использовать, вы можете создать новый компонент для средства выбора, поместив выбранное значение средства выбора в состояние и обновив это состояние при обратном вызове onValueChange.

Кажется, это проблема, теперь она решена, спасибо за ваше время. Я боролся с этим.

Jesus Gonzalez 28.05.2019 17:41

Другие вопросы по теме