我正在try 向我的聊天应用程序添加一个功能,允许用户返回他们最近访问过的聊天室,并在其中创建了一条消息.现在我只是想在页面上显示聊天室的名字.

我的 firebase 基地数据库是这样 struct 的.

-ChatRooms(collection)
  -"chat room name" (document)
  -room(name of chat room)
  -uid
    -messages(subcollection)
      -created
      -room(name of chat room)
      -text
      -uid
      -user(display name)
      -userPic

我正在try 进入"Messages"子集,这样我就可以查询它,只显示用户访问过的聊天室的名称.如果Messages子集合中文档的"uid"与Firebase"auth"currentUser.uid的"uid"匹配.

这是我的密码.

 const [chatRoomData, setChatRoomData] = useState([]);
 const [firebaseUserInfo, setFirebaseUserInfo] = useState(auth.currentUser);


  useEffect(() =>{
    onAuthStateChanged(auth, currentUser => {
      setFirebaseUserInfo(currentUser);
      const chatRoomCollectionRef = collection(dataBase, "ChatRooms/room/messages");
      console.log(chatRoomCollectionRef)
      const queryChatRooms = query(chatRoomCollectionRef, where("uid", "==", currentUser.uid));
      const unSubscribe = onSnapshot(queryChatRooms, (snapshot) => {
        const chatRooms = [];
        snapshot.forEach((doc) => {
          chatRooms.push({...doc.data(), id: doc.id});
        });
        setChatRoomData(chatRooms);
      })
      return () => unSubscribe();
    })
  }, []);

  return (
    <>
        <div className="chats-container">
          <header className='header-container'> 
            <h1 className="header">Your Chats</h1>
          </header>
          {chatRoomData.map((data) =>(
            <div className='users-chatRooms-container' key={data.id}>
              <button className='users-chatRooms'>{data.chatRoom}</button>
            </div>
          ))}
        </div>
    </>
  );
}  

我试过了,页面上什么都没有显示.我的代码有什么问题?

推荐答案

这是我在不看到数据的情况下所能做的最好的例子

import { useEffect, useState } from 'react';
import { onAuthStateChanged } from 'firebase/auth';
import { collection, query, where, onSnapshot } from 'firebase/firestore';
import { auth, dataBase } from 'your-firebase-config'; // Replace with your actual Firebase configuration

const YourComponent = () => {
  const [chatRoomData, setChatRoomData] = useState([]);
  const [firebaseUserInfo, setFirebaseUserInfo] = useState(auth.currentUser);

  useEffect(() => {
    onAuthStateChanged(auth, (currentUser) => {
      if (currentUser) {
        setFirebaseUserInfo(currentUser);

        const messagesCollectionRef = collection(dataBase, "ChatRooms"); // Assuming "ChatRooms" is your collection
        const queryChatRooms = query(messagesCollectionRef, where("uid", "==", currentUser.uid));

        const unSubscribe = onSnapshot(queryChatRooms, (snapshot) => {
          const chatRooms = [];
          snapshot.forEach((doc) => {
            const messagesSubcollectionRef = collection(doc.ref, "messages");
            const queryMessages = query(messagesSubcollectionRef, where("uid", "==", currentUser.uid));

            onSnapshot(queryMessages, (messagesSnapshot) => {
              messagesSnapshot.forEach((messageDoc) => {
                chatRooms.push({ chatRoom: messageDoc.data().room, id: messageDoc.id });
              });

              setChatRoomData(chatRooms);
            });
          });
        });

        return () => unSubscribe();
      }
    });
  }, []);

  return (
    <>
      <div className="chats-container">
        <header className="header-container">
          <h1 className="header">Your Chats</h1>
        </header>
        {chatRoomData.map((data) => (
          <div className="users-chatRooms-container" key={data.id}>
            <button className="users-chatRooms">{data.chatRoom}</button>
          </div>
        ))}
      </div>
    </>
  );
};

export default YourComponent;

确保用您的实际Firebase配置替换‘Your-Firebase-CONFIG’.如果这不能解决问题,请考虑判断您的FiRestore struct 并相应地调整代码.

或者,如果问题只是打印下一个对象,

你可以用递归来解决这个问题,在这里.举个例子:

const RecursivePrint = ({ data }) => {
  return (
    <div>
      {Object.keys(data).map((key) => {
        const value = data[key];

        if (typeof value === 'object' && value !== null) {
          return (
            <div key={key}>
              <strong>{key}:</strong>
              <RecursivePrint data={value} />
            </div>
          );
        } else {
          return (
            <div key={key}>
              <strong>{key}:</strong> {value}
            </div>
          );
        }
      })}
    </div>
  );
};

// Example usage:
const data = {
  name: 'John Doe',
  age: 30,
  address: {
    street: '123 Main St',
    city: 'Cityville',
  },
};

const App = () => {
  return (
    <div>
      <h1>Recursive Print Example</h1>
      <RecursivePrint data={data} />
    </div>
  );
};

Reactjs相关问答推荐

使用Reaction钩子窗体验证可选字段

有没有办法在Shopify中显示自定义计算的交货日期?

XChaCha20-Poly1305的解密函数

在React中使用映射创建flex组件

定位数组中的一项(React、useState)

在 React 中,如何在指向同一组件的路由中拥有未定义数量的多个动态路径段?

FabricJS反序列化问题

获取 不能显示为 的后代.错误,但不太确定如何构建我的代码以避免此警告

ReactJS 中的图像加载顺序

Zod 验证模式根据另一个数组字段使字段成为必需字段

如何使用 redux 和 react-plotly.js

如何防止开发人员使用 ESLint 在 React 项目中使用特定的钩子?

在 React 中使用复选框管理状态

antd 找不到 comments

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

React Final Form - 单选按钮在 FieldArray 中不起作用

在 redux 中分派到另一个减少时状态值不会改变

如何使图标适合 react-bootstrap 中的行元素

调用 Jest 和服务方法的问题

如何在 React 中制作动画?