Javascript 如何使用钩子从react native中的firebase实时数据库读取数据

Javascript 如何使用钩子从react native中的firebase实时数据库读取数据,javascript,react-native,firebase-realtime-database,react-native-flatlist,react-native-firebase,Javascript,React Native,Firebase Realtime Database,React Native Flatlist,React Native Firebase,下面是我所做的 useEffect(() => { database() .ref(`/User/`) .on('value', function(snapshot) { const list = []; snapshot.val(doc => { const { name, email} = snapshot.val(); list.push({

下面是我所做的

useEffect(() => {
        database()
        .ref(`/User/`)
        .on('value', function(snapshot) {
          const list = [];
          snapshot.val(doc => {
            const { name, email} = snapshot.val();
            list.push({
              id: doc.id,
              name,
              email,
            });
          });                



          
          setUsers(list);
          setLoading(false);
    
          console.log('User data: ', snapshot.val());
        });
  
    
        
    }, [userId]);

   
它会在控制台上显示来自数据库的信息,但不会显示在应用程序上,为firebase firestore执行此操作效果良好,但不会将任何信息加载到应用程序页面

下面是我如何使用flatlist和list.item标记在应用程序中显示数据库中的数据

<FlatList
data={users}
ItemSeparatorComponent={() => <Divider />}
keyExtractor={item => item.id}
renderItem={({ item }) => (
  <TouchableOpacity
    onPress={() => navigation.navigate('Room', { thread: item })}
  >
    <List.Item
      title={item.name}
      description={item.email}
      titleNumberOfLines={1}
      titleStyle={styles.listTitle}
      descriptionStyle={styles.listDescription}
      descriptionNumberOfLines={1}
    />
  </TouchableOpacity>
)}
}
keyExtractor={item=>item.id}
renderItem={({item})=>(
导航('Room',{thread:item})}
>
)}
/>


我使用的是react-native和firebase的最新版本,您不应该再次将回调传递给
snapshot.val()

应该是:

ref.once('value',函数(快照){
forEach(函数(userSnapshot){
var userKey=userSnapshot.key;
var userData=userSnapshot.val();
//userData['id']=userKey;
push(userData);
});
});
你也可以试试这个库


这就是成功的原因,平面列表需要一个id才能通过,非常感谢那些帮助完成好捕获的人。1) 它是
snapshot.forEach
实际上,不是
snapshot.val
和2)您需要获取迭代器的
val()
,否则每次都会得到
/User/name
/User/email
。users.push(id,userData);这就是有效的方法,感谢您在列表随时更新时所做的澄清,它形成了另一个数组,添加到以前的数组中,我如何使它使用更新后的数组重新生成一个数组information@RaphaelInyang可以在snapshot.forEach之前清空数组;类似于users=[]
 database()
          .ref(`/User/`)
          .once('value', function(snapshot) {  snapshot.forEach(function(userSnapshot) {
const id = userSnapshot.key;
const userData = userSnapshot.val();
  userData['id'] = id;
users.push(id, userData);  });});