计算变量在 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