如何使用 react 和 firebase 创建聊天室?

Posted

技术标签:

【中文标题】如何使用 react 和 firebase 创建聊天室?【英文标题】:How to make a Chat room with react and firebase? 【发布时间】:2021-11-04 10:56:02 【问题描述】:

我正在使用 Expo、React、Firebase 和 Material UI,我制作了一个社交媒体应用程序,现在我正在尝试在我的应用程序中创建一个聊天室。我找到了一些有趣的文章、教程和文档,并让这段代码工作。

聊天.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  />
                                    <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  />
                            <p>text</p>
                        </div>
                    </div>
                ))
            </div>
            <SendMessages scroll=scroll />
            <div ref=scroll></div>
        </div>
    )


export default Chat

现在我可以从我的个人资料中写入消息,并且 Firebase 数据库也在工作。

但现在我想知道如何让所有用户互相写作? 我想让它像 Instagram 聊天室一样,你点击聊天按钮,你会看到其他用户,你点击他们,你写他们。

我希望你知道我的意思哈哈:)

【问题讨论】:

嘿,是的,您的回答很有帮助。我确定我点击了复选标记,但显然我错了。对不起,谢谢! :) 【参考方案1】:

一种常见的建模方式是,让每个聊天室成为自己的文档,然后将该聊天室的消息存储在其下的子集合中。

所以在一个看起来像这样的数据结构中:

ChatRooms (collection)
  ChatRoom1 (document)
    Messages (collection)
      ...
  ChatRoom2 (document)
    Messages (collection)
      ...  

所以现在您有两个聊天室,每个聊天室都有自己的消息子集。在聊天室文档中,您通常会存储有关该聊天室的更多全局信息,例如属于该聊天室的用户、其名称,例如该聊天室的最新消息的文本和时间戳

虽然有很多方法可以对此进行建模,所以我建议从这个(或您认为合理的任何模型)开始,然后在您扩展用例时对其进行调整。

【讨论】:

以上是关于如何使用 react 和 firebase 创建聊天室?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 firebase/auth 和 react-native 验证他/她的电子邮件后立即登录用户而不创建整个登录页面?

如何通过 map 函数有条件地使用 React 和 Firebase 渲染元素?

如何测试 Firebase 登录操作(React/Jest)

当用户已经在聊天时,Firebase 聊天会阻止推送通知

使用firebase聊天时如何从下到上设置数据

登录 Firebase React Native Expo 后无法获取用户数据