【问题标题】:Fetch data from firebase realtime database, React Native (expo)从 Firebase 实时数据库中获取数据,React Native (expo)
【发布时间】:2019-11-25 07:26:51
【问题描述】:

我有那个代码,我需要在这里获取数据而不是静态数组。 注意:已经连接到 firebase 实时数据库和所有这些东西,我只需要获取数据并映射它们,我需要将它们呈现在一个列表中。

const rec = [
    {
        name: 'Brothers Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg',
        address: 'Address St. Random Number',
        link: 'Home'
    },
    {
        name: 'Example Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
    {
        name: 'Example Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
    {
        name: 'Example Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
]

const discover = [
    {
        name: 'Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg',
        address: 'Address St. Random Number',
        link: 'Home'
    },
    {
        name: 'Example Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
    {
        name: 'Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg',
        address: 'Address St. Random Number',
        link: 'Home'
    },
    {
        name: 'Example Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
    {
        name: 'Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg',
        address: 'Address St. Random Number',
        link: 'Home'
    },
    {
        name: 'Example Discover Restaurant',
        avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
        address: 'Address St. Random Number 23',
        link: 'About'
    },
]

export default class RestaurantScreen extends Component {
    static navigationOptions = {
        title: 'Restaurants',
        headerStyle: {
            backgroundColor: '#c4463d',
        },
        headerTintColor: '#fff',
        headerTitleStyle: {
            fontWeight: 'bold',
        },
    }

    render() {
        return (
            <View style={styles.container}>
                <Text style={{ fontSize: 24, fontWeight: '700', color: '#c4463d' }}>Recommendations</Text>
                <ScrollView
                    style={styles.categories}>
                    <View>
                        {
                            rec.map((l, i) => (
                                <ListItem
                                    key={i}
                                    leftAvatar={{ source: { uri: l.avatar_url } }}
                                    title={l.name}
                                    address={l.subtitle}
                                    onPress={() => this.props.navigation.navigate(`${l.link}`)}
                                    bottomDivider
                                />
                            ))
                        }
                    </View>
                </ScrollView>
                <View style={styles.recommendations}>
                    <Text style={{ fontSize: 24, fontWeight: '700', color: '#c4463d' }}>Discover</Text>
                    <ScrollView>
                        {
                            discover.map((l, i) => (
                                <ListItem
                                    key={i}
                                    leftAvatar={{ source: { uri: l.avatar_url } }}
                                    title={l.name}
                                    address={l.subtitle}
                                    bottomDivider
                                />
                            ))
                        }
                    </ScrollView>
                </View>
            </View>
        )
    }
}

说实话,来自 expo 的官方文档并没有太大帮助 ^^ 而且我无法发布这个东西,因为我这里有很多代码? -.-

【问题讨论】:

    标签: reactjs firebase react-native mobile expo


    【解决方案1】:

    基本上,如果一切都设置好了,您只需将监听器放在生命周期方法(componentDidMount)中并将数据设置为状态。 有关更多信息,您可以查看 firebase js sdk

    https://firebase.google.com/docs/web/setup

    export default class RestaurantScreen extends Component {
        
        state = {
          rec: [],
          discover: []
        }
        
        static navigationOptions = {
            title: 'Restaurants',
            headerStyle: {
                backgroundColor: '#c4463d',
            },
            headerTintColor: '#fff',
            headerTitleStyle: {
                fontWeight: 'bold',
            },
        }
        
        componentDidMount() {
          firebase.database().ref('places').on('value', (snapshot) => {
            const rec = snapshot.val();
            this.setState({ rec, discover: rec })
          });
        
        }
    
        render() {
          const { rec, discover } = this.state;
        
            return (
                <View style={styles.container}>
                    <Text style={{ fontSize: 24, fontWeight: '700', color: '#c4463d' }}>Recommendations</Text>
                    <ScrollView
                        style={styles.categories}>
                        <View>
                            {
                                rec.map((l, i) => (
                                    <ListItem
                                        key={i}
                                        leftAvatar={{ source: { uri: l.avatar_url } }}
                                        title={l.name}
                                        address={l.subtitle}
                                        onPress={() => this.props.navigation.navigate(`${l.link}`)}
                                        bottomDivider
                                    />
                                ))
                            }
                        </View>
                    </ScrollView>
                    <View style={styles.recommendations}>
                        <Text style={{ fontSize: 24, fontWeight: '700', color: '#c4463d' }}>Discover</Text>
                        <ScrollView>
                            {
                                discover.map((l, i) => (
                                    <ListItem
                                        key={i}
                                        leftAvatar={{ source: { uri: l.avatar_url } }}
                                        title={l.name}
                                        address={l.subtitle}
                                        bottomDivider
                                    />
                                ))
                            }
                        </ScrollView>
                    </View>
                </View>
            )
        }
    }

    【讨论】:

    • 您好,感谢您的回答。我收到类型错误。 TypeError: undefined is not a function ('...discover.map...' 附近)
    • 使用您的凭据检查 Firebase 设置!
    • @ChristosTsamis,初始化发现.. 我已经编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2022-01-23
    相关资源
    最近更新 更多