React-Native Firestore - 获取评论部分的用户信息

Posted

技术标签:

【中文标题】React-Native Firestore - 获取评论部分的用户信息【英文标题】:React-Native Firestore - Get user info for a comment section 【发布时间】:2022-01-16 12:13:34 【问题描述】:

我正在使用 react-native 和 react-native-firebase 构建应用程序,但在尝试实现评论部分时遇到了问题。

我的数据树目前是这样的: 集合(cmets)/doc(currentUser.uid)/collection(userComments)/doc(commentCreatorID)

在这个文档 commentCreatorID 中有我需要的所有数据。所以基本上是内容,时间戳......

对于这一部分,一切正常,但为了让评论创作者的信息与他的帖子保持一致,我需要在其他地方获取它们。 我这样做的方式是获取 doc(commentCreatorID),因为它是该用户的 uid,并要求 firestore 在我的“用户”集合中向我提供具有相同 id 的文档中的数据。

这是我的代码:

  const [comments, setComments] = useState([])
  const [commentsReady, setCommentsReady] = useState([])

useEffect(() => 

        setComments([])
        setLoading(true)
        firestore()
        .collection('comments')
        .doc(auth().currentUser.uid)
        .collection('userComments')
        .get()
        .then((snapshot) => 
            let comments = snapshot.docs.map(doc => 
                const data = doc.data()
                const id = doc.id
                return id, ...data
            )
            setComments(comments)
        )
        .then(() => 
            comments.forEach(comment => 
                firestore()
                .collection("users")
                .doc(comment.id)
                .get()
                .then((snapshot) => 
                    const data = snapshot.data()
                    setCommentsReady(comments, ...data)       
                )
            )
        )
       console.log(commentsReady)
        setLoading(false)
    , [handleScroll4])

这似乎不像现在那样有效。我的日志将一个空数组直接扔到我的脸上.. 我正确地抓取了每个评论,甚至每个用户的数据都对应于他们的 uid。 ForEach 完成后,我可以记录它们。 但由于某种原因,我无法将它们设置为我的状态 cmetsReady。

我错过了什么吗?

感谢您的宝贵时间

【问题讨论】:

setComments 是异步的,因此当您使用 cmets.forEach 时不会设置 cmets。 【参考方案1】:

useState 函数返回的设置器是异步的。将数据从一种状态复制到另一种状态也是一种反模式。尝试使用效果。

const TT = () => 
  const [comments, setComments] = useState([]);
  const [userInfos, setUserInfos] = useState([]);

  const commentsView = comments.map(comment => 
    // Reactively merge each comment with the appropriate user info
  );

  useEffect(() => 
    firestore()
    .collection('comments')
    .doc(auth().currentUser.uid)
    .collection('userComments')
    .get()
    .then((snapshot) => 
        let comments = snapshot.docs.map(doc => 
            const data = doc.data()
            const id = doc.id
            return id, ...data
        );
        setComments(comments);
    );
  , []);

  useEffect(async () => 
    // Maybe keep a cache of fetched user datas, but not sure how this is architected
    const snapshots = await Promise.all(comments.map(comment => 
      return firestore()
      .collection("users")
      .doc(comment.id)
      .get();
    ));
      setUserInfos(snapshots.map(snap => snap.data()));
    , [comments]);
;

【讨论】:

以上是关于React-Native Firestore - 获取评论部分的用户信息的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore:无法访问Firestore后端(仅限Android)

从 Firestore 的一个集合中获取所有文档

Firebase/Firestore 配置文件更新不成功

Cloud Firestore 是不是支持 React Native

如何在 iOS 上禁用 Firestore 的持久性(缓存)

为啥 Firestore 的 'doc.get('time').toMillis' 会产生空类型错误?