【发布时间】:2020-05-21 11:13:27
【问题描述】:
我正在尝试在本机反应中构建一个平面列表,其中显示帖子及其信息和用户信息。所有这些数据都存储在 firebase 中。我使用以下函数将此数据调用到数据状态变量中:
getPosts = (limit = 20) => {
var list = [];
firebase.firestore()
.collection("posts").get().then((querySnapshot) => {
querySnapshot.forEach(async (doc) => {
var tempList = doc.data();
const usersQs = await firebase.firestore().collection("users").where('email', '==', doc.data().email).get();
usersQs.forEach(doc2 => {
Object.assign(tempList, {
"userName": doc2.data().name,
"avatar": doc2.data().avatar
});
});
list.push(tempList);
});
list.sort(function(a, b) {
var c = b.timestamp;
var d = a.timestamp;
return c - d;
});
this.setState({
data: list,
fullData: list
});
});
return new Promise((resolve, reject) => {
this.func;
resolve(_.take(this.state.fullData, limit));
});
};
这个函数将正确的数据加载到数据状态中,但是在我尝试将这些数据加载到 Flatlist 之后,它看起来像这样:
renderPost = post => {
return (
<View style={styles.feedItem}>
<Image source={post.avatar} style={styles.avatar} />
<View style={{ flex: 1 }}>
<View style={{ flexDirection: "row", justifyContent: "space-between", alignItems: "center" }}>
<View>
<Text style={styles.name}>{post.userName}</Text>
<Text style={styles.timestamp}>{moment(post.timestamp).fromNow()}</Text>
</View>
<Ionicons name="ios-more" size={24} color="#73788B" />
</View>
<Text style={styles.post}>{post.text}</Text>
<Image source={post.image && {uri: post.image}} style={styles.postImage} resizeMode="cover" />
<View style={{ flexDirection: "row" }}>
<Ionicons name="ios-heart-empty" size={24} color="#73788B" style={{ marginRight: 16 }} />
<Ionicons name="ios-chatboxes" size={24} color="#73788B" />
</View>
</View>
</View>
);
};
render() {
return (
<View style={styles.container}>
<View style={styles.header}>
<Text style={styles.headerTitle}>Feed</Text>
</View>
<FlatList
style={styles.feed}
data={this.state.data}
renderItem={({ item }) => this.renderPost(item)}
keyExtractor={item => item.timestamp.toString()}
showsVerticalScrollIndicator={false}
ListFooterComponent={this.renderFooter}
refreshing={this.state.refreshing}
onRefresh={this.handleRefresh}
onEndReached={this.handleLoadMore}
onEndThreshold={100}
/>
</View>
我在以下代码中调用 getPosts 函数,该函数在重新加载和刷新时运行:
componentDidMount() {
this.makeRemoteRequest();
}
...
makeRemoteRequest = _.debounce(() => {
this.setState({ loading: true });
this.getPosts(this.state.postNumLoad)
.then(posts => {
this.setState({
loading: false,
data: posts,
fullData: posts,
refreshing: false
});
})
.catch(error => {
this.setState({ error, loading: false, refreshing: false });
});
}, 250);
handleRefresh = () => {
this.setState({
refreshing: true
}, () => {
this.makeRemoteRequest();
});
};
handleLoadMore = () => {
this.setState({
postNumLoad: this.state.postNumLoad + 20
}, () => {
this.makeRemoteRequest();
});
};
此数据在我重新加载后会闪烁,但不会始终显示在屏幕上。当我不重新加载时,屏幕上不会出现任何内容。我的状态如下所示:
constructor(props) {
super(props);
this.state = {
data: [],
downloadImage: '../assets/images/temporaryProfilePicture.jpg',
loading: false,
error: null,
fullData: [],
refreshing: false,
postNumLoad: 20
};
}
我的总体问题是:如何使平面列表中的数据始终保持在屏幕上,而不总是重新加载和刷新数据?任何帮助将不胜感激。提前谢谢!
【问题讨论】:
-
您何时何地致电
getPosts? -
我刚刚更新了问题以包含此代码。很抱歉有歧义。
标签: javascript reactjs firebase react-native google-cloud-firestore