如何使用 React 和 Firebase 创建聊天室?
How to make a Chat room with react and firebase?
我正在与 Expo、React、Firebase 和 Material UI 合作,我制作了一个社交媒体应用程序,现在我正在尝试在我的应用程序中制作一个聊天室。我找到了一些有趣的文章、教程和文档,并让这段代码起作用。
Chat.js
import React, { useState, useEffect, useRef } from 'react'
import { db, auth } from '../firebase'
import SendMessages from './SendMessages'
function Chat() {
const scroll = useRef()
const [messages, setMessages] = useState([])
useEffect(() => {
db.collection('messages').orderBy('createdAt').limit(50).onSnapshot(snapshot => {
setMessages(snapshot.docs.map(doc => doc.data()))
})
}, [])
return (
<div>
<div className="msgs">
{messages.map(({ id, text, photoURL, uid }) => (
<div>
<div key={id} className={`msg ${uid === auth.currentUser.uid ? 'sent' : 'received'}`}>
<img src={photoURL} alt="" />
<p>{text}</p>
</div>
</div>
))}
</div>
<SendMessages scroll={scroll} />
<div ref={scroll}></div>
</div>
)
}
export default Chat
SendMessages.js
import React, { useState, useEffect, useRef } from 'react'
import { db, auth } from '../firebase'
import SendMessages from './SendMessages'
function Chat() {
const scroll = useRef()
const [messages, setMessages] = useState([])
useEffect(() => {
db.collection('messages').orderBy('createdAt').limit(50).onSnapshot(snapshot => {
setMessages(snapshot.docs.map(doc => doc.data()))
})
}, [])
return (
<div>
<div className="msgs">
{messages.map(({ id, text, photoURL, uid }) => (
<div>
<div key={id} className={`msg ${uid === auth.currentUser.uid ? 'sent' : 'received'}`}>
<img src={photoURL} alt="" />
<p>{text}</p>
</div>
</div>
))}
</div>
<SendMessages scroll={scroll} />
<div ref={scroll}></div>
</div>
)
}
export default Chat
现在我可以从我的个人资料中写消息了,而且 Firebase 数据库也能正常工作了。
但现在我想知道如何让所有用户都可以互相写信?
我想让它有点像 Instagram 聊天室,你点击聊天按钮,你会看到其他用户,你点击他们,你写他们。
希望你明白我的意思哈哈:)
一种常见的建模方式是,让每个聊天室成为它自己的文档,然后将该聊天室的消息存储在其下的子集合中。
所以在一个看起来像这样的数据结构中:
ChatRooms (collection)
ChatRoom1 (document)
Messages (collection)
...
ChatRoom2 (document)
Messages (collection)
...
现在您有两个聊天室,每个聊天室都有自己的消息子集。在聊天室文档中,您通常会存储有关该聊天室的更多全局信息,例如属于该聊天室的用户、聊天室的名称,例如发送到该聊天室的最新消息的文本和时间戳。
虽然还有很多方法可以对此进行建模,因此我建议从这个(或您认为合理的任何模型)开始,然后在扩展用例时对其进行调整。
我正在与 Expo、React、Firebase 和 Material UI 合作,我制作了一个社交媒体应用程序,现在我正在尝试在我的应用程序中制作一个聊天室。我找到了一些有趣的文章、教程和文档,并让这段代码起作用。
Chat.js
import React, { useState, useEffect, useRef } from 'react'
import { db, auth } from '../firebase'
import SendMessages from './SendMessages'
function Chat() {
const scroll = useRef()
const [messages, setMessages] = useState([])
useEffect(() => {
db.collection('messages').orderBy('createdAt').limit(50).onSnapshot(snapshot => {
setMessages(snapshot.docs.map(doc => doc.data()))
})
}, [])
return (
<div>
<div className="msgs">
{messages.map(({ id, text, photoURL, uid }) => (
<div>
<div key={id} className={`msg ${uid === auth.currentUser.uid ? 'sent' : 'received'}`}>
<img src={photoURL} alt="" />
<p>{text}</p>
</div>
</div>
))}
</div>
<SendMessages scroll={scroll} />
<div ref={scroll}></div>
</div>
)
}
export default Chat
SendMessages.js
import React, { useState, useEffect, useRef } from 'react'
import { db, auth } from '../firebase'
import SendMessages from './SendMessages'
function Chat() {
const scroll = useRef()
const [messages, setMessages] = useState([])
useEffect(() => {
db.collection('messages').orderBy('createdAt').limit(50).onSnapshot(snapshot => {
setMessages(snapshot.docs.map(doc => doc.data()))
})
}, [])
return (
<div>
<div className="msgs">
{messages.map(({ id, text, photoURL, uid }) => (
<div>
<div key={id} className={`msg ${uid === auth.currentUser.uid ? 'sent' : 'received'}`}>
<img src={photoURL} alt="" />
<p>{text}</p>
</div>
</div>
))}
</div>
<SendMessages scroll={scroll} />
<div ref={scroll}></div>
</div>
)
}
export default Chat
现在我可以从我的个人资料中写消息了,而且 Firebase 数据库也能正常工作了。
但现在我想知道如何让所有用户都可以互相写信? 我想让它有点像 Instagram 聊天室,你点击聊天按钮,你会看到其他用户,你点击他们,你写他们。
希望你明白我的意思哈哈:)
一种常见的建模方式是,让每个聊天室成为它自己的文档,然后将该聊天室的消息存储在其下的子集合中。
所以在一个看起来像这样的数据结构中:
ChatRooms (collection)
ChatRoom1 (document)
Messages (collection)
...
ChatRoom2 (document)
Messages (collection)
...
现在您有两个聊天室,每个聊天室都有自己的消息子集。在聊天室文档中,您通常会存储有关该聊天室的更多全局信息,例如属于该聊天室的用户、聊天室的名称,例如发送到该聊天室的最新消息的文本和时间戳。
虽然还有很多方法可以对此进行建模,因此我建议从这个(或您认为合理的任何模型)开始,然后在扩展用例时对其进行调整。