React Native, цикл For показывает только первый элемент массива

#javascript #reactjs #react-native #for-loop

#javascript #reactjs #react-native #цикл for

Вопрос:

У меня есть эта функция, которая должна перебирать 20 элементов массива (smn), чтобы показать элементы, удовлетворяющие условию IF, с помощью этого кода я получил только первые элементы массива:

     renderSMN() {
    const smn = ['fb', 'twt', 'snp', 'ins', 'ytu', 'lnk', 'tik', 'beh', 'pin', 'tmp', 'www', 'eml', 'wap', 'msg', 'tlg', 'lin', 'wch', 'skp', 'snd', 'oth'];
    for (let i = 0; i < 20; i  ) {
        //alert(this.state.data.smu_ smn[i]);
        alert(i);
        if (this.state.data.smu_ smn[i] != "") {
            return (
                <View style={{ margin: 5 }}>
                    <TouchableOpacity onPress={() => {
                        this.props.navigation.navigate('Result', { postId: item.uid, otherParam: 'Pass whatever you want here', });
                    }}>
                        <Image source={{ uri: 'http://localhost/rest/smn/'   smn[i]   '.png' }} style={{ width: 100, height: 100, right: 0, }} />
                    </TouchableOpacity>
                <Text>{i}</Text>
                </View>
            );
        }
  

Вот как я получаю данные из файла JSON:

         fetch('http://localhost/rest/api/single_read.php/?id='   postId, {
        method: 'GET'
    })
        .then((response) => response.json())
        .then((responseJson) => {
            console.log(responseJson);
            this.setState({
                data: responseJson
            })
        })
        .catch((error) => {
            console.error(error);
        });
  

Ответ №1:

Похоже, вы досрочно выходите из цикла, возвращая JSX при первом smn , который соответствует условию. Вместо этого вы можете захотеть вернуть массив JSXES, некоторые из которых являются ложными. Вы можете сделать это, map заменив smn s на JSX. Обратите внимание, что при работе с массивами JSX рекомендуется явно передавать key prop корневому элементу каждого элемента массива.

 renderSMN() {
    const smn = ['fb', 'twt', 'snp', 'ins', 'ytu', 'lnk', 'tik', 'beh', 'pin', 'tmp', 'www', 'eml', 'wap', 'msg', 'tlg', 'lin', 'wch', 'skp', 'snd', 'oth'];
    return smn.map((s, i) => {
        alert(i);
        if (this.state.data.smu_ s != "") {
            return (
                <View style={{ margin: 5 }} key={i}>
                    <TouchableOpacity
                        onPress={() => {
                        this.props.navigation.navigate('Result', { postId: item.uid, otherParam: 'Pass whatever you want here', });
                        }}
                    >
                        <Image source={{ uri: 'http://localhost/rest/smn/'   s   '.png' }} style={{ width: 100, height: 100, right: 0, }} />
                    </TouchableOpacity>
                    <Text>{i}</Text>
                </View>
            );
        }
    });
}
  

Обратите внимание, что если условие не выполняется, функция возвращает undefined неявно, что является ложным.

Комментарии:

1. Я использую this.state.data.smu_nam для отображения элемента (Name) в формате JSON при рендеринге, но это не работает в функции, которую я создал.

2. Я не понимаю вашего вопроса @HowardJohn

3. Я использовал this.state.data.smu_nam для отображения данных из JSON, он отлично работает внутри <View> , но не где-либо еще.

Ответ №2:

На первой итерации вы возвращаетесь из renderSMN без продолжения цикла.

Я бы посоветовал сделать что-то вроде.

 return smn.map(smnItem => {
    if(this.state.data.smu_ smnItem !== '') {
        return (...)
    } 

    return null;
});
  

вместо цикла for. Что позволяет по-прежнему использовать ключевое слово return

Вы бы хотели заменить экземпляры smn [i] на smnItem