firebase - React Native 将 2 个 Firestore 集合合并到一个 Flatlist 中

标签 firebase react-native google-cloud-firestore expo react-native-flatlist

我在 Firestore 中有 2 个集合可以像这样执行 FeedScreen

采集用户(用户注册App时)

users = [
    avatar: '',
    email: '',
    name: ''
]

收藏帖子(当用户创建帖子时)

posts = [
   image: '',
   text: '',
   timestamp: '',
   uid: ''
]

我对这样的收藏帖子进行useState

const [loading, setLoading] = useState(true);
const [post, setPost] = useState([]); // Initial empty array of users

useEffect(() => {
  const subscriber = firebase
    .firestore()
    .collection("posts")
    .orderBy("timestamp", "desc")
    .onSnapshot((querySnapshot) => {
      const post = [];

      querySnapshot.forEach((doc) => {
        post.push({
          key: doc.id,
          name: doc.data().name, //want name from collection users
          text: doc.data().text,
          timestamp: doc.data().timestamp,
          avatar: { uri: doc.data().avatar }, //want avatar from collection users
          image: { uri: doc.data().image },
        });
      });

      setPost(post);
      setLoading(false);
    });

  // Unsubscribe from events when no longer in use
  return () => subscriber();
}, []);

if (loading) {
  return <ActivityIndicator />;
}

还有Flatlist

<FlatList
  style={styles.feed}
  data={post}
  renderItem={({ item }) => this.renderPost(item)}
  keyExtractor={(item) => item.key}
  showsVerticalScrollIndicator={false}
/>;

我尝试 useState collection('users') 并将其与 map 结合起来,但出现错误

我想将帖子中的所有数据显示到平面列表,并从用户集合中获取头像和姓名。

最佳答案

您应该从 2 个集合列表创建一个新数组.data 是下面示例中您所需要的。

const users = [
  {
    id: “”,
    avatar: “ “ ,
    email : “ “ ,
    name: ""
  },
];

const post = [
  {
    image: "", 
    text: "", 
    timestamp: ,, 
    uid: ""
  }
];


const collectionUsers = {}:
users.forEach((item) => {
  if(collectionUsers[item.id] {
     collectionUsers[item.id] += item.avatar;
  } else {
    collectionUsers[item.id] = item.avatar;
  }
});


const data = post.map((item) => ({
   … item,
   avatar: collectionUsers[item.id]
})):

console.log(data);


<FlatList 
       data={post}
       keyExtractor={(item, index) => String(index)} 
       renderItem={({ item }) => ( 
               <View> 
                     <Text> 
                            {item.avatar} 
                    </Text> 
              </View> 
      )} 
  />

可以帮助您的其他文档:

https://www.tutorialguruji.com/javascript/combine-multiple-firestore-collection-in-one-flatlist-in-react-native/

https://rnfirebase.io/firestore/usage-with-flatlists

https://medium.com/@harshita.arun.1/firebase-to-flatlist-react-native-5281718969ab

关于firebase - React Native 将 2 个 Firestore 集合合并到一个 Flatlist 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69560436/

相关文章:

firebase - 哪个 docker 镜像包含 firebase 和 gcloud 的 CLI?

angular - 如何在 ion-item 中使用 *ngFor 以便每个都有单独的功能

ios - Firebase 我可以将 observeSingleEvent 与 .childAdded 一起使用吗?

react-native - Apollo Refetch() 后组件 `props.data` 不会重新加载

javascript - 使用 firebase 对数字进行排序

javascript - typescript promise 数组在一种情况下正确解决但在另一种情况下不正确

reactjs - 如何将我的 firestore 集合文档映射到表中

android - 如何通过 Wireshark 调试 Firebase 问题?

javascript - Expo React Native 仅加载自定义字体一次

android - react native Firebase : Token refresh not working