#javascript #reactjs #firebase #firebase-realtime-database
#javascript #reactjs #firebase #firebase-realtime-database
Вопрос:
итак, в основном я делал приложение для чата в 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 amp;amp; currentUser){
addListeners(currentChannel.id);
}
}, [])
const displayMessages = messages =>{
messages.length > 0 amp;amp; 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;
Ответ №1:
ваш useEffect запускается только при первом рендеринге, поэтому вы должны ввести что-то в массив зависимостей или использовать react-redux-firebase, есть встроенный прослушиватель. 🙂
Комментарии:
1. Вы правы, когда я добавил [addListeners] в качестве зависимости, приложение работает как шарм, но с ошибкой в консоли (превышена максимальная глубина обновления.), Как я могу это исправить? является ли react-redux-firebase решением?
2. Если вы поместите addListeners в качестве зависимости, вы получите бесконечный цикл. Возможно, вы можете использовать логическое значение, которое изменяется с true на false, или использовать обратный вызов для функции, но react-redux-firebase тоже может быть решением. 🙂