Squeak.ru - шаблоны программирования

React Native рендеринг компонента дважды, но renderItem не обновляет значения?

Я пытаюсь заполнить FlatList пользовательских компонентов (<EventCard>) на экране, однако ни один из элементов компонентов не отображается. Пример: компонент titlein my пуст, а не «Тестовое событие», как показано в выводе терминала.

Внутри componentWillMount() я запрашиваю свою базу данных для заполнения массива, который затем используется в renderItem для заполнения FlatList

Вывод терминала показывает начальный render() с пустым массивом, а затем второй render() с данными.

Моя предполагаю состоит в том, что компоненты пытаются извлечь данные из пустого массива, в результате чего они становятся пустыми. Я сбит с толку, потому что второй вызов render() регистрируется, так что компонент не будет отображаться снова? с полным массивом?

После некоторых исследований я думаю, что мне может понадобиться вызвать forceUpdate() или что-то подобное, чтобы получить обновленные данные из массива. Я также пытался возиться с componentWillReceiveProps(), но я тоже не могу заставить это работать (Источник). Честно говоря, я не уверен, использую ли я renderItem, это может способствовать моей проблеме.

Я не включил EventCard.js, так как совершенно уверен, что это не источник ошибки, но могу по запросу.

18:00:16: RENDER
18:00:16: Array []
18:00:17: RENDER
18:00:17: Array [
18:00:17:   Object {
18:00:17:     "date": "Fri Dec 07 2018",
18:00:17:     "host": "Test host",
18:00:17:     "key": "-L4mE_YKKbrvaMVNaA2T",
18:00:17:     "location": "",
18:00:17:     "time": "08:30",
18:00:17:     "title": "Test event",
18:00:17:     "volunteersHave": 1,
18:00:17:     "volunteersNeed": "20",
18:00:17:   },
18:00:17: ]

Соответствующий файл Dashboard.js

import React from 'react';
import { Button, FlatList, StyleSheet, Text, View} from 'react-native';
import { Icon } from 'react-native-elements';
import EventCard from './EventCard';    
import * as firebase from 'firebase';

export default class Dashboard extends React.Component {
    constructor(props){
        super(props)
        this.state = {
            eventArr: [],
        }
    }

    componentWillMount = () => {
        var tempArr = [];
        firebase.database().ref('/events/').once('value').then((snapshot) => {
            tempArr = this.snapshotToArray(snapshot);
            this.setState({
                eventArr: tempArr
            });
        });
    }

    snapshotToArray = snapshot => {
        var retArr = [];
        snapshot.forEach(childSnapshot => {
            var item = childSnapshot.val();
            item.key = childSnapshot.key;
            retArr.push(item);
        });
        return retArr;
    };

    render(){
        console.log('RENDER')
        console.log(this.state.eventArr)
        return (
            <View>
                <FlatList
                    data={this.state.eventArr}
                    renderItem={({item}) =>
                        <EventCard>
                            title={item.title}
                            date={item.date}
                            location={item.location}
                            rsvp={item.volunteersHave}
                            time={item.time}
                            onPress={() => navigate('EventPage')}
                        </EventCard>}
                />
            </View>
        );
    }
}
//styles omitted
const styles = StyleSheet.create({
});

  • Так в чем же настоящая проблема, с которой вы столкнулись? 08.02.2018
  • Ни один из элементов компонента <EventCard> не отображается, т.е. пустая строка для title. Я отредактирую свой вопрос, чтобы более конкретно описать свою проблему. 08.02.2018
  • Я думаю, что функция renderItem неверна 08.02.2018
  • Это возможно, я пытался следовать документам React Native, но я не уверен на 100% в своем понимании взаимодействия между FlatList и renderItem. 08.02.2018

Ответы:


1

Я думаю, что ваша проблема связана с вашей функцией renderItem. В частности, у вас есть все реквизиты за пределами EventCard

<EventCard>
    title={item.title}
    date={item.date}
    location={item.location}
    rsvp={item.volunteersHave}
    time={item.time}
    onPress={() => navigate('EventPage')}
</EventCard>

Должно быть

<EventCard
    title={item.title}
    date={item.date}
    location={item.location}
    rsvp={item.volunteersHave}
    time={item.time}
    onPress={() => navigate('EventPage')}> 
</EventCard>
08.02.2018
  • Всегда самые простые вещи... Спасибо. 08.02.2018
  • Я почти уверен, что мы все были там. 08.02.2018

  • 2

    Вы неправильно переносите параметры

    Вы должны попробовать это:

    <EventCard
        title={item.title}
        date={item.date}
        location={item.location}
        rsvp={item.volunteersHave}
        time={item.time}
        onPress={() => navigate('EventPage')}
    />
    
    08.02.2018
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...