【发布时间】:2021-04-26 02:21:57
【问题描述】:
我正在使用 .onSnapshot 从 Fire 存储中实时获取数据,效果很好,我正在按预期接收数据。问题是我正在接收多组数据,组件并没有等到接收到所有数据才渲染。
所以我的问题是,对于我当前的代码,它们是否可以让我在显示它们之前等待获取所有数据集?
我当前的代码是:
import React, {useEffect, useState} from 'react';
import {ActivityIndicator, Dimensions, Text, View} from 'react-native';
import firestore from '@react-native-firebase/firestore';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import FolloweringScreens from './FolloweringScreens';
import {TouchableOpacity} from 'react-native-gesture-handler';
const {width, height} = Dimensions.get('screen');
function Following({urlname, navigation}) {
const [followingData, setfollowingData] = useState([]);
// Follower counts, displayname, image
const fetchData = () => {
const dataRef = firestore().collection('usernames');
dataRef
.doc(urlname)
.collection('Following')
.onSnapshot((snapshot) => {
snapshot.forEach((doc) => {
dataRef.doc(doc.id.toLowerCase()).onSnapshot((followerDoc) => {
const data = followerDoc.data();
setfollowingData((prev) => [
...prev,
{
profileName: doc.id,
displayName: data.userName,
followerCount:
data.followers !== undefined ? data.followers : 0,
followingCount:
data.following !== undefined ? data.following : 0,
image: data.imageUrl ? data.imageUrl : null,
},
]);
});
});
});
};
useEffect(() => {
fetchData();
}, []);
return (
<>
<View
style={{
left: width * 0.04,
top: 50,
flexDirection: 'row',
alignItems: 'center',
width: '80%',
height: '4%',
marginBottom: 5,
}}>
{/* {console.log('followin', followingData)} */}
<TouchableOpacity onPress={() => navigation.openDrawer()}>
<Icon name="menu" color="#222" size={30} />
</TouchableOpacity>
<Text style={{left: width * 0.05}}>Following</Text>
</View>
{followingData === [] ? (
<ActivityIndicator size="large" color="black" />
) : (
<>
<FolloweringScreens data={followingData} />
</>
)}
</>
);
}
export default Following;
【问题讨论】:
-
使用加载状态,初始为 false,然后在快照上设置为 true,直到加载后才显示 ui。不要使用
onSnapshot,如果你想获取一次数据,只需使用get -
我希望每当数据发生变化时显示也会发生变化,所以我需要使用onSnapshot。或者他们是一种使用 get() 并在数据更改时更新组件的方法?因为当我使用 get() 时,我可以通过 promise 等待所有数据被获取,但是当数据发生变化时,你必须手动刷新才能显示更改。
-
然后坚持使用 onSnapshot,使用状态
isLoading默认 false,然后在快照解析后将 isLoading 设置为 true,并在 isLoading true 上显示加载指示器,并在 isLoading false 时显示您的 ui。然后您将更新推送到您的状态,一旦数据完全加载,用户就会看到数据 -
当 dong this 时,会显示加载器,并且一旦获取了第一组数据,就会加载 UI,其他组数据会依次显示,而不是所有数据获取,然后显示 UI。我应该在哪里触发 setloading?不幸的是,似乎在获取第一组数据后立即触发状态更改。
标签: javascript react-native google-cloud-firestore promise fetch