开发者问题收集

Firebase.db.collection 不是函数 || Firebase v9 || 将集合文档设置为状态时抛出错误

2021-12-17
1489

我正在使用 Firebase v9 开发一个 Expo React Native 项目。出于某种原因,我能够在 Firestore 中监听“chats”集合并成功将它们 console.log 或设置为变量,但是当我尝试将它们设置为某个状态时,我收到此错误:

“TypeError:_firebase.db.collection 不是函数。(在 '_firebase.db.collection("chats")' 中,'_firebase.db.collection' 未定义)”

例如,此 useEffect 正确地将我想要的对象数组打印到控制台:

useEffect(
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        console.log(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            data: doc.data(),
          }))
        )
      ),
    []
  );

但是,当我将 console.log 换成 setChats 时,我收到上述错误。

useEffect(
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        setChats(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            data: doc.data(),
          }))
        )
      ),
    []
  );

我也正确地从 React 导入了 useState。我还可以将这些快照文档设置为变量,但如果我尝试使用该变量设置状态(即:setChats(myVar);),我会收到此错误。

我已经被这个问题困扰了好几个小时,无论如何也不明白为什么我会收到这个错误。有什么想法吗?谢谢!🙏

2个回答

也许可以尝试初始化一个空数组并将文档推送到其中。然后设置Chats(数组)。类似这样的操作...

useEffect(
const data = []
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        
          snapshot.docs.map((doc) => ({
            data.push({id: doc.id,
            data: doc.data(),})
            
          })
          setChats(data)
        )
      ),
    []
  );
Olly
2021-12-17

将数据推送到数组然后进入使用状态对我来说是可行的

useEffect(() => {
    const q = query(collection(db, 'posts'))
    onSnapshot(q, (querySnapshot) => {
      const posts = []
      querySnapshot.forEach((doc) => {
        posts.push({ id: doc.id, data: doc.data() })
      })

      setPosts(posts)
    })
  }, [])
Zubair Kamboh
2021-12-17