firebase - 将 Firebase 数据渲染到 FlatList
问题描述
我正在使用React Native,Rematch for Redux 和 Firebase Firestore。我正在尝试从我的Firebase数据库中提取数据并将其填充到我的FlatList中。问题是,它没有给我任何错误,而是给了我一个空白的白屏。我不知道我哪里错了。
这就是我的数据库的样子 - 列表activities
这就是我的 Rematch for 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)
我不知道为什么我会得到这个结果。请帮我 :)
解决方案
如果你在 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] })) })
推荐阅读
- python - 使用 selenium webdriver 获取 python 中文本框的 aria-invalid 的值
- node.js - Docker撰写未与上传文件同步的外部卷
- nginx - Nginx - 位置指令中的参数数量无效 - 正则表达式捕获带有空格的组
- react-native - React native:Ios 上的错误,但在 android 上没有
- nim-lang - Nim 是否支持自动投射?
- java - 使用未在数据集中提交的 SPARQL 插入数据 Jena ARQ
- wpf - 在.Net Core中添加值后如何刷新WPF数据网格
- wordpress - 如何在跨域(iframe)和同源场景中登录wordpress?
- wordpress - 条纹 Wordpress 发票
- cygwin - 我想在 Cygwin64 上构建 cgreen