使用 firebase 和 react js 计算未读消息
Count unread messages using firebase and react js
我正在使用 next js 构建网络聊天应用程序,firebase.How 我可以实现未读消息计数器吗?我在消息文档中使用名为 read 的布尔字段来检查消息是否已读。
我尝试使用 useEffect,但我的计数器似乎只是不停地增加。
const [notification,SetNotification]=useState(0)
const[messages,SetMessages]=useState([])
useEffect(()=>{
const getMessages=async ()=>{
const data=await getDocs(lastMessageRef)
SetMessages(data.docs.map((doc)=>({...doc.data(), id:doc.id})))
};
getMessages();
messages.forEach((message)=>{
if(message.read==false){
SetNotification(notification+1)
}
})
},[messages])
console.log(notification)
将您的代码拆分为两个单独的 useEffect
。此外,在循环中使用 SetNotifaction
会导致很多问题。我建议改用 Array.filter
。
const [notification,SetNotification] = useState(0)
const [messages,SetMessages] = useState([])
useEffect(() => {
const getMessages = async () => {
const data = await getDocs(lastMessageRef)
SetMessages(data.docs.map((doc) => ({...doc.data(), id:doc.id})))
};
getMessages();
}, [messages]);
useEffect(() => {
const unreadMessages = messages.filter(message => message.read === false)
SetNotification(unreadMessages.length)
}, [messages]);
我正在使用 next js 构建网络聊天应用程序,firebase.How 我可以实现未读消息计数器吗?我在消息文档中使用名为 read 的布尔字段来检查消息是否已读。
我尝试使用 useEffect,但我的计数器似乎只是不停地增加。
const [notification,SetNotification]=useState(0)
const[messages,SetMessages]=useState([])
useEffect(()=>{
const getMessages=async ()=>{
const data=await getDocs(lastMessageRef)
SetMessages(data.docs.map((doc)=>({...doc.data(), id:doc.id})))
};
getMessages();
messages.forEach((message)=>{
if(message.read==false){
SetNotification(notification+1)
}
})
},[messages])
console.log(notification)
将您的代码拆分为两个单独的 useEffect
。此外,在循环中使用 SetNotifaction
会导致很多问题。我建议改用 Array.filter
。
const [notification,SetNotification] = useState(0)
const [messages,SetMessages] = useState([])
useEffect(() => {
const getMessages = async () => {
const data = await getDocs(lastMessageRef)
SetMessages(data.docs.map((doc) => ({...doc.data(), id:doc.id})))
};
getMessages();
}, [messages]);
useEffect(() => {
const unreadMessages = messages.filter(message => message.read === false)
SetNotification(unreadMessages.length)
}, [messages]);