reactjs 如何访问子集合中的文档?

e37o9pze  于 5个月前  发布在  React
关注(0)|答案(2)|浏览(38)

我试图添加一个功能到我的聊天应用程序,让用户回到他们最近访问过的聊天室,并创建了一个消息。现在我只是试图显示页面上的聊天室名称。
我的firebase数据库结构是这样的。

-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

字符串
我试图进入“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>
    </>
  );
}


我尝试了这个,页面上没有显示任何内容。我的代码有什么问题?

q7solyqu

q7solyqu1#

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

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;

字符串
请确保将'your-firebase-config'替换为实际的Firebase配置。如果这不能解决问题,请考虑检查Firestore结构并相应地调整代码。

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

你可以用递归来解决这个问题,这里有一个例子:

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>
  );
};

rxztt3cl

rxztt3cl2#

你需要引用每个“room”文档,然后访问它的“messages”子集合。另外,确保你使用了正确的字段名称。尝试以下代码:

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

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

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

      const chatRoomCollectionRef = collection(dataBase, 'ChatRooms');
      const queryChatRooms = query(chatRoomCollectionRef, where('uid', '==', currentUser.uid));

      const unSubscribe = onSnapshot(queryChatRooms, (snapshot) => {
        const chatRooms = [];
        snapshot.forEach(async (doc) => {
          const messagesQuerySnapshot = await getDocs(collection(doc.ref, 'messages'));
          messagesQuerySnapshot.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;

字符串
请务必根据原计划调整进口报表。如有疑问,请咨询。

相关问题