将Firebase数据渲染到FlatList

时间:2019-11-10 18:30:37

标签: firebase react-native redux google-cloud-firestore

我正在对Redux和Firebase Firestore 使用 React Native 重新匹配。我试图从我的 Firebase 数据库中提取数据,并将其填充到我的 FlatList 中。问题是,它没有给我任何错误,并且给了我空白的白色屏幕。我不知道我要去哪里错了。

这就是我的数据库的样子-activities的列表

activities database picture

这是我对Redux 商店的重赛:

import firebase from 'firebase';
import db from '../config/firebase'

const activity = {
    state: {},
    reducers: {
        activities(state, payload) {
            return {
                ...state,
                ...payload
            }
        },
    },
    effects: {
        async getActivities() {
            try {
                const response = await db.collection('activities').get()
                //console.log(response.docs.map(doc => doc.data()))
                return dispatch({ type: 'activity/activities', payload: response.docs.map(doc => doc.data()) })
            } catch (err) {
                alert(err)
            }
        },
    }
}

export default activity

这是我使用 FlatList 的组件:

import * as React from 'react';
import {
  Text,
  TouchableOpacity,
  View,
  FlatList,
  ImageBackground
}
  from 'react-native';
import styles from '../styles'
import { connect } from 'react-redux';
import '@expo/vector-icons';
import 'redux';

class Activities extends React.Component {
  state = {
    movetoArray: [],
    outputActivity: [],
  };

  async componentDidMount() {
    const activities = await this.props.getActivities()
    this.state.movetoArray = Object.values(activities)
    this.state.outputActivity = Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] }));
    //this.state.arrayActivity = Object.entries(activities).map(item => ({...item[1], key: item[0]}));
    console.log(this.state.outputActivity)
  }

  _renderItem = ({ item }) => (
    <TouchableOpacity
      onPress={() => this.props.navigation.navigate('activitiesMD',
        {
          title: item.name,
          objectData: item.data
        })}>
      <ImageBackground source={item.image} style={styles.inputTiles} imageStyle={{ borderRadius: 10 }}>
        <View style={styles.inputTileTextView}>
          <Text style={[styles.inputTileText, { color: item.colour }]}>{item.name}</Text>
        </View>
      </ImageBackground>
    </TouchableOpacity>
  );

  render() {
    const { routeName } = this.props.navigation.state
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.outputActivity}
          keyExtractor={item => item.id}
          renderItem={this._renderItem}
        />
      </View>
    );
  }
}

const mapState = (state) => ({
  activity: state.activity,
})

const mapDispatch = (dispatch) => ({
  getActivities: () => dispatch.activity.getActivities(),
})

export default connect(mapState, mapDispatch)(Activities)

我不知道为什么我得到了这个结果。请帮助我:)

Outcome

1 个答案:

答案 0 :(得分:3)

如果您直接在React中更改状态,则该组件不会重新渲染。请像这样使用this.setState({ ... })

- this.state.movetoArray = Object.values(activities)
- this.state.outputActivity = Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] }));

+ this.setState({ movetoArray: Object.values(activities), outputActivity: Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] })) })