Показывать сообщение о пустом списке только после того, как загрузчик завершится в React Native с использованием плоского списка

У меня есть плоский список, который получает источник данных в виде состояния. На самом деле, это данные из firebase, и я использую избыточность. Итак, данные извлекаются в действиях, и с помощью обратного вызова я получаю данные для состояния.

Чего я хочу добиться, так это того, что, когда данные из API не найдены, в представлении должно отображаться пустое сообщение со списком. На самом деле, я добился этого, используя «ListEmptyComponent». Но происходит то, что экран начинается с пустого сообщения, а счетчик загружается под ним, а затем, если данные найдены, сообщение исчезает, как и счетчик.

Но то, что я хотел, это то, что когда представление отображается, первое, что все должны увидеть, это счетчик, а затем, если скрывается пустой счетчик данных, отображается сообщение о пустом списке.

Как этого добиться?

Мои действия:

export const fetchOrderHistory = (phone, callback) => {
return (dispatch) => {
    dispatch({ type: START_SPINNER_ACTION_FOR_ORDER_HISTORY })
    firebase.database().ref('orders/'+phone)
    .on('value', snapshot => {
        const snapShotValue = snapshot.val();
        callback(snapShotValue);
        dispatch ({ type: ORDER_HISTORY_FETCHED , payload: snapshot.val()});
        dispatch({ type: STOP_SPINNER_ACTION_FRO_ORDER_HISTORY })
    });

};

};

Мой плоский список и счетчик:

<FlatList
                        data = {this.state.historyOfOrders}
                        keyExtractor = {item => item.uid}
                        ListEmptyComponent = {this.onListEmpty()}
                        renderItem = {({ item }) => (
                            <Card
                            containerStyle = {{ borderRadius: 5 }}
                            >
                            <View style = {styles.topContainerStyle}>
                                    <View>
                                        <TouchableOpacity
                                        onPress = {() => this.props.navigation.navigate('ViewOrderScreen', {itemsOfOrder: item}) }
                                        >
                                            <View style = {styles.viewOrderContainer}>
                                            <View style = {styles.viewOrderTextContainer}>
                                                <Text style = {styles.viewOrderTextStyle}>View Order</Text>
                                            </View>
                                            <Icon 
                                            name='ios-arrow-forward'
                                            type='ionicon'
                                            color='#ff7675'
                                            />
                                            </View>
                                        </TouchableOpacity>
                                    </View>
                                </View>
                            </View>
                        </Card> 
                        )}
                    />

                    {this.props.isSpinnerLoading &&
                    <View style = {styles.loading}>
                        <ActivityIndicator size = "large" color = "#03A9F4"/>
                    </View> }

Мой обратный вызов в componentWillMount, который установил состояние:

 componentWillMount() {
   this.props.fetchOrderHistory((this.props.phone), (snapShotValue)=> {
        const userOrderHistory = _.map(snapShotValue, (val,uid) => ({uid, ...val}))
        this.setState({ historyOfOrders: userOrderHistory })
   });
}

Мое сообщение EmptyList:

onListEmpty = () => {
   return <View style = {{ alignSelf: 'center' }}>
        <Text style = {{ fontWeight: 'bold', fontSize: 25 }}>No Data</Text>
    </View>
}

Мое состояние:

state = { historyOfOrders: "" }

Я получаю значения счетчика от редукторов, используя mapStateToProps.

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 864
2

Ответы 2

Путь, который вы должны выбрать, - это рендеринг только счетчика, когда установлен флаг загрузки, и рендеринг списка, когда флаг загрузки равен false. Ваш метод рендеринга должен быть таким, как показано ниже.

render()
{

   if (this.props.isSpinnerLoading)
   {
       return (<View style = {styles.loading}>
                        <ActivityIndicator size = "large" color = "#03A9F4"/>
                    </View> );
   }

   return (/** Actual List code here **/);
}

вы должны сделать две вещи для этого. Во-первых, показывать Flatlist, только если загрузчик остановлен. Во-вторых, установите значение по умолчанию для this.state.historyOfOrders равным нулю и проверьте, не является ли значение this.state.historyOfOrders нулевым, а затем покажите только Flatlist.

Вот код:

{(!this.props.isSpinnerLoading && this.state.historyOfOrders != null) ? 
    (
    <FlatList
        data = {this.state.historyOfOrders}
        keyExtractor = {item => item.uid}
        ListEmptyComponent = {this.onListEmpty()}
        renderItem = {({ item }) => (
            <Card containerStyle = {{ borderRadius: 5 }}>
                <View style = {styles.topContainerStyle}>
                    <View>
                        <TouchableOpacity onPress = {() => this.props.navigation.navigate('ViewOrderScreen', {itemsOfOrder: item}) }>
                            <View style = {styles.viewOrderContainer}>
                                <View style = {styles.viewOrderTextContainer}>
                                    <Text style = {styles.viewOrderTextStyle}>View Order</Text>
                                </View>
                                <Icon 
                                name='ios-arrow-forward'
                                type='ionicon'
                                color='#ff7675'
                                />
                            </View>
                        </TouchableOpacity>
                    </View>
                </View>
            </Card> 
        )}
    /> 
    ) : null
}

С этим условием, даже если вам нужен загрузчик выше Flatlist, вы можете это сделать.

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