Реагировать на родной плоский список остается проверенным; реквизит изменился - PullRequest
0 голосов
/ 17 сентября 2018

У меня действительно большая проблема, и я не знаю, что я делаю неправильно. Я также пытался все отладить, и я не нашел никакого решения.

Прежде всего, скажем, у меня есть 2 компонента. ИЗ компонента A Я отправляю некоторые реквизиты (массив) в компонент B. I компонент B Я загружаю эти реквизиты в свое состояние, а затем меняю некоторые данные в flatlist и сохраняю их в своем состоянии в этом компоненте. Когда я возвращаюсь к предыдущему экрану, где находится компонент A и возвращаюсь к B, этот плоский список остается тем же, а PROPS остается тем же.

Начальные реквизиты с экрана A: (когда я впервые перехожу к компоненту B)

"listOfStudents":[{"key":"Suana Kristovski","id":"1358","checked":false,"o":false,"n":false}]

Когда я меняю элемент в flatlist и возвращаюсь назад, это реквизит, который поступил в компонент B:

listOfStudents":[{"key":"Suana Kristovski","id":"1358","checked":true,"o":false,"n":false}]

проверено с false -> true,

Проблема в том, что все, что я делаю, я меняю свое состояние только тогда, когда элемент меняется в моем плоском списке.

Код на экране B:

componentDidMount() {

        //console.log('Izvedem se vedno');
        console.log('List of students Diary hours: ' + JSON.stringify(this.props.listOfStudents));

        this.setState({
            data: this.props.navigation.state.params.props.listOfStudents,
            textOpombe: this.props.navigation.state.params.props.notes,
            textVsebinaUre: this.props.navigation.state.params.props.lesson,
            finished: this.props.navigation.state.params.props.finished,
            absent: parseInt(this.props.navigation.state.params.props.apsent.substring(0,1)),
        }); 


        if(this.props.navigation.state.params.props.listOfStudents.length >= 2) {

            this.setState({
                height: 130
            });
        }

        this.props.navigation.addListener('willBlur', (playload)=>{

        });
      }

Мой плоский список:

<FlatList
                                    ref={(list) => this.myList = list}
                                    style={[styles.flatList,{height: this.state.height}]}
                                    data={this.state.data}
                                    scrollEnabled = {this.state.scrollingChild}

                                    contentContainerStyle={{ padding: 15 }}
                                    renderItem={({ item }) => (

                                          <View style={styles.listItemStyle}>
                                            <View style={{flexDirection: 'row', marginBottom: 7, }}>

                                                {
                                                    item.checked && 
                                                    <TouchableOpacity
                                                        onPress={this.changeCheckedToFalse.bind(this,item)}>
                                                        <View style={styles.checked} /> 
                                                    </TouchableOpacity> || 
                                                    <TouchableOpacity
                                                        onPress={this.changeCheckedToTrue.bind(this,item)}>
                                                        <View style={styles.unchecked} />
                                                    </TouchableOpacity>
                                                }


                                                <Text style={{color: '#000', opacity: 0.6}}>{item.key}</Text>
                                                {
                                                    item.checked &&
                                                    <View style={{position: 'absolute', right: 0 }}>
                                                        <View style={{flexDirection: 'row'}} >
                                                        {
                                                            item.o &&
                                                            <TouchableOpacity 
                                                                style={[styles.touchable1Ch,styles.iconStyle1]} 
                                                                onPress={this.changeSelectionO.bind(this,item)}>

                                                                <Text style={{color: '#fff', fontSize: 18, alignSelf: 'center' }}>O</Text>
                                                            </TouchableOpacity> ||
                                                            <TouchableOpacity 
                                                                style={[styles.touchable1,styles.iconStyle1]} 
                                                                onPress={this.changeSelectionO.bind(this,item)}>

                                                                <Text style={{color: '#fff', fontSize: 15, alignSelf: 'center' }}>O</Text>
                                                            </TouchableOpacity>
                                                        }
                                                        {
                                                            item.n &&
                                                            <TouchableOpacity 
                                                                style={[styles.touchable2Ch,styles.iconStyle1]} 
                                                                onPress={this.changeSelectionN.bind(this,item)}>
                                                                <Text style={{color: '#fff', fontSize: 18, alignSelf: 'center' }}>N</Text>
                                                            </TouchableOpacity> ||
                                                            <TouchableOpacity 
                                                                style={[styles.touchable2,styles.iconStyle1]}
                                                                onPress={this.changeSelectionN.bind(this,item)}>
                                                                <Text style={{color: '#fff', fontSize: 15, alignSelf: 'center' }}>N</Text>
                                                            </TouchableOpacity>
                                                        }




                                                        </View>
                                                    </View>
                                                }
                                            </View>
                                            {
                                                this.props.navigation.state.params.props.listOfStudents !== undefined && this.props.navigation.state.params.props.listOfStudents.length >= 2 ?
                                                <View style={styles.line} /> : <Text></Text>
                                            }

                                          </View>



                                    )}
                                    keyExtractor={item => item.id}
                                />

Методы для изменения списка плоских списков:

changeSelectionO(item) {
        var data2 = this.state.data;

        var itemIndex = data2.map(function (x) { return x.key; }).indexOf(item.key);



        if(data2[itemIndex].o) {
            data2[itemIndex].o = false;
        } else {
            data2[itemIndex].o = true;
            if(data2[itemIndex].n) {
                data2[itemIndex].n = false;
            }

        }



        this.setState({
            data: data2
        });
        //this.props.listOfStudents

    }

    changeSelectionN(item) {
        var data2 = this.state.data;

        var itemIndex = data2.map(function (x) { return x.key; }).indexOf(item.key);

        if(data2[itemIndex].n) {
            data2[itemIndex].n = false;
        } else {
            data2[itemIndex].n = true;
            if(data2[itemIndex].o) {
                data2[itemIndex].o = false;
            }

        }



        this.setState({
            data: data2
        });
        //this.props.listOfStudents

      }

Подскажите, пожалуйста, почему меняется реквизит?

...