【问题标题】:How to asynchronously retrieve realtime firebase data in JS?如何在 JS 中异步检索实时 firebase 数据?
【发布时间】:2021-02-10 04:34:50
【问题描述】:

所以基本上我一直在 react.js 中做一个聊天应用程序,我达到了我并不总是从数据库接收数据的水平,有时我收到它有时没有,而且状态并不总是更新了,怎么办?

import { Segment, Comment } from 'semantic-ui-react';
import MessageForm from './MessagesForm';
import MessagesHeader from './MessagesHeader';
import firebase from '../../firebase'
import { useSelector } from 'react-redux';
import Message from './Message';

const Messages = () => {
  const [messagesRef, setMessagesRef] = useState(firebase.database().ref('messages'));
  const [messages, setMessages] = useState([]);
  const [messagesLoading, setMessagesLoading] = useState(true);
  const {currentChannel} = useSelector(state => state.channel);
  const {currentUser} = useSelector(state => state.user);
  

  const addListeners = channelId =>{
    addMessageListeners(channelId);
  }

  const addMessageListeners = channelId =>{
    let loadedMessages = [];
    messagesRef.on('child_added', (snapshot) => {
      loadedMessages.push(snapshot.val())
      setMessages(loadedMessages);
    })
  }



useEffect(() => {
    if(currentChannel && currentUser){
    addListeners(currentChannel.id);
    }
  }, [])


  
  const displayMessages = messages =>{
    messages.length > 0 && messages.map(message => (
      <Message key={message.timestamp} message={message} user={currentUser} />
    ))
  }

  return (
    <>
    <MessagesHeader />
    <Segment>
      <Comment.Group className='message'>
        {displayMessages(messages)}
        
      </Comment.Group>
    </Segment>

    <MessageForm  messagesRef={messagesRef}/>
    </>
  )
}

export default Messages;

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database


    【解决方案1】:

    你的 useEffect 只在第一次渲染时运行,所以你应该给依赖数组一些东西,或者使用 react-redux-firebase,有一个内置的监听器。 :)

    【讨论】:

    • 你说得对,当我将 [addListeners] 添加为依赖项时,该应用程序就像一个魅力,但在控制台中出现错误(超过最大更新深度。),我该如何解决它? react-redux-firebase 是解决方案吗?
    • 如果你把 addListeners 作为依赖你得到一个无限循环。也许你可以使用一个布尔值,从 true 变为 false,或者 useCallback 作为函数,但是 react-redux-firebase 也可以是一个解决方案。 :)
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2017-04-04
    相关资源
    最近更新 更多