开发者问题收集

计算变量在 useEffect 中返回未定义

2021-09-23
117

我正在使用 Firestore 后端在 React Native 上构建聊天应用程序。

我的结构如下:

Channels
    -Channel
    {
        user1,
        user2,
        messages:[] (This is a subcollection not an array inside the document)
    }

我想检查是否有包含所选用户的频道。

检查器函数:

const [chatRef, setChatRef] = useState()
let channelRef = db.collection("Channels")

channelRef.get().then((snapshot) => {
    snapshot.forEach((doc) => {
        let room = doc.data()

        if (
            (room.user1.id === user.id || room.user2.id === user.id) &&
            (room.user1.id === personToChat.id || room.user2.id === personToChat.id)
        ) {
            setChatRef(channelRef.doc(room.id).collection("Messages"))
        } else {
            channelRef.doc(user.id).set({
            user1: user,
            user2: personToChat,
        })
        setChatRef(channelRef.doc(user.id).collection("Messages"))
        }
    })
})

useEffect:

useEffect(() => {
    const unsubscribe = chatRef.onSnapshot((querySnapshot) => {
        const messagesFirestore = querySnapshot
        .docChanges()
        .filter(({ type }) => type === "added")
        .map(({ doc }) => {
            const message = doc.data()
            return { ...message, createdAt: message.createdAt.toDate() }
        })
        .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())

      appendMessages(messagesFirestore)
    })

    return () => unsubscribe()
}, [])

我尝试了什么?

  • 我尝试使用变量而不是状态。没有用。
  • 我尝试使用函数获取 chatRef 变量。没有用。
  • 我使用 chatRef 作为依赖项。没有用。
  • 我在 useEffect 中调用了检查函数。不起作用。

所有这些都会导致相同的错误,即 TypeError:undefined 不是对象(评估“chatRef.onSnapshot”)

2个回答

发生这种情况的原因是,当您的 useEffect 运行时,您的 chatRef 状态未初始化。由于依赖项数组为空,您的 useEffect 仅运行一次。

Renan Felipe Ferreira
2021-09-23

我通过将chatref作为父组件的道具发送作为道具来解决。并将其用作儿童组件的依赖。

此功能来自“联系人列表”页面。它处理联系人的新闻事件。单击时,它会导航到聊天室。我使用react.useref存储chatref并将其作为道具发送到聊天室。

630809875

然后在聊天室屏幕中,我将其用作依赖关系并检查了其无效。

573774033
basedman
2021-09-24