Запрос не выполняется вовремя при вызове компонента Tab.Screen

#react-native #react-navigation #carousel

#react-native #реакция-навигация #карусель

Вопрос:

У меня есть проект, в котором я использую react-navigation, и я реализую нижнюю вкладку, подобную этой:

  render() {
    return (
        <NavigationContainer>
            <Tab.Navigator>
                <Tab.Screen name="Home" component={this.HomeScreen} />
                <Tab.Screen name="Settings" component={this.SettingsScreen} />
            </Tab.Navigator>
        </NavigationContainer>
    );
}
  

..который вызывается this.HomeScreen на одном из экранов, а затем this.SettingsScreen на другом.

Здесь я опубликую код первого из них:

 HomeScreen({ navigation }) {      
    const restaurants_discounts = this.restaurants_discounts();     
    return (
        <SafeAreaView style={styles.safeArea}>                
            <View style={styles.container}>                   
                <ScrollView
                     style={styles.scrollview}
                     scrollEventThrottle={200}
                     directionalLockEnabled={true}>                        
                     {restaurants_discounts}      
                </ScrollView>
            </View>
        </SafeAreaView >
    );
}
  

При вызове функции ниже у нее нет данных для отображения, потому что this.state.discounts она пуста, так как getDiscounts() вызывается позже :

  restaurants_discounts() {
    return (
        <View style={styles.exampleContainer}>             
            <Carousel
                ref={c => this._slider1Ref = c}
                data={this.state.discounts}
                renderItem={this._renderDiscounts.bind(this)}                   
                ...           
            >
            </Carousel>
        </View>
    );
}


getDiscounts() {   //this is being called after `restaurants_discounts()` has been called 
        var ref = firestore().collection('discounts')
        ref.onSnapshot((querySnapshot => {
             var discounts = querySnapshot.docs.map(doc => { return { ...doc.data(), discount_id: doc.id } });
             this.setState({
                discounts: discounts                        
             });                
        }));
    }
}
  

getDiscounts() вызывается в componentDidMount() :

 componentDidMount() {   
   this.getDiscounts();
}
  

Ответ №1:

вы возвращаете компонент только тогда, когда определено this.state.discount . Например:

     restaurants_discounts() {
        if (this.state.discounts === undefined || this.state.discounts === null) 
            return (<View><Text>Loading...</Text></View>);
        return ( 
            <View style={styles.exampleContainer}>             
                <Carousel
                    ref={c => this._slider1Ref = c}
                    data={this.state.discounts}
                    renderItem={this._renderDiscounts.bind(this)}                   
                    ...           
                >
                </Carousel>
            </View>
        );
    }
  

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

1. Это будет отображаться Loading... , так?! Мне нужно отобразить выбранные данные. Проблема в том, что он извлекается ПОСЛЕ установки render()

2. у меня была опечатка в коде, исправил ее. Должно быть this.state.discounts

3. речь не об этом, пожалуйста, прочитайте мой пост должным образом! Мне НУЖНО ОТОБРАЖАТЬ ИЗВЛЕЧЕННЫЕ ДАННЫЕ, А НЕ ЗНАЧОК ЗАГРУЗКИ

4. Код, который у меня есть, проверяет ваши данные (я предполагаю, что он находится в объекте this.state.discounts). Если данные не существуют, отобразите сообщение о загрузке. Если он существует, отобразите ваши данные. Вот как работает React.

5. Я знаю, как работают реакции, я спрашиваю, почему данные не отображаются (ОНИ НАХОДЯТСЯ В СОСТОЯНИИ), но кажется, что я выполняю рендеринг до того, как получу данные, так как я должен это исправить.