Я создаю приложение чата с базой данных Firebase FireStore и Resatjs
Я пытаюсь использовать перехватчики реагирования для управления потоком данных, но у меня возникают проблемы с отключением прослушивателя Firestore.
Этот эффект использования - то, где я инициализирую слушателя.
useEffect(() => {
setMessages(null)
roomId && listenForMessages(roomId, setMessages, false, scrollToBottom)
return () => {
if (active && setMessages) {
//Detach here
listenForMessages(roomId, setMessages, true)
}
}
}, [roomId ])
Это моя функция слушателя
export const listenForMessages = (roomId, setMessages, detach, scrollToBottom) => {
let listener = db
.collection('chats')
.doc(roomId)
.collection('messages')
.orderBy('timestamp')
.onSnapshot(
docSnapshot => {
let data = []
docSnapshot.docs.forEach(doc => data.push({ id: doc.id, ...doc.data() }))
setMessages(data)
scrollToBottom()
},
err => {
console.log(`Encountered error: ${err}`)
}
)
if (detach === true) {
listener()
}
}
Эта ошибка, кажется, отсоединяет ранее подключенных слушателей. Как будто я открываю чат A , затем перехожу в чат B и чат A получает сообщение, оно вызывает переписывание сообщений.