从 firebase 收集反应地图

React map over collection from firebase

我正在努力使用 Google Firebase 实时数据库,但我无法创建集合数组。

当我在控制台日志中循环 const return 时,我将所有消息作为单独的对象获取,但我只希望消息以大数组形式出现,以便我可以在此处循环。我希望有人能帮助我。

到目前为止,这是我的代码:

// Libraries
import * as React from 'react';
import { useState, useEffect } from 'react';
import { getDatabase, ref, onValue } from 'firebase/database';

// Components
import Container from '~/common/Container';

import '~/utils/firebase';

export interface MessageProps {
  messageId?: string;
  content?: string;
  likes?: number;
  timestamp?: number;
  user?: string;
}

/**
 * Homepage
 *
 * @returns {JSX.Element}
 */
const Home: React.FC = (): JSX.Element => {
  const [messages, setMessages] = useState<MessageProps[]>([{}]);
  const db = getDatabase();
  const dbMessage = ref(db, 'messages/');

  useEffect(() => {
    onValue(dbMessage, (snapshot) => {
      snapshot.forEach((childSnapshot) => {
        const messageData = childSnapshot.val();
        setMessages([
          ...messages,
          {
            content: messageData.content,
            likes: messageData.likes,
            timestamp: messageData.likes,
            user: messageData.user,
          },
        ]);
      });
    }, {
      onlyOnce: true,
    });
  }, []);

  console.log(messages);

  return (
    <Container>
      <p>Map (loop) comes here...</p>
    </Container>
  );
};

// Connect and export
export default Home;

我已尝试使用 useEffect 解决此问题,但我认为这不是必需的,但请告诉我。我想我已经接近了...

在您的 useEffect 中,您正在为结果中的每个子节点调用 setMessages。如果在处理完所有子节点后只调用一次 setMessages,事情会快得多:

useEffect(() => {
  onValue(dbMessage, (snapshot) => {
    let data = [];
    snapshot.forEach((childSnapshot) => {
      const messageData = childSnapshot.val();
      data.push(messageData);
    });
    console.log(data);
    setMessages(data);
  });
}, []);