【发布时间】:2021-03-14 21:09:06
【问题描述】:
您好,我正在尝试构建一个简单的聊天,但在阅读消息时遇到了一些问题。
const [messages, setMessages] = useState([]);
const messagesArray = [];
const messagesRef = firestore().collection('messages');
useEffect(() => {
id
? messagesRef
.where('idRequest', '==', id)
.orderBy('createdAt')
.limit(25)
.get()
.then((response) => {
response.forEach((doc) => {
messagesArray.push(doc.data());
});
setMessages(messagesArray);
console.log('Changes: ', messages);
})
: console.log('No ID provided.');
}, [messages]);
如果我使用依赖项 'messages' 运行它,它可以工作,但应用程序变得非常慢,所以我放置了一个 console.log 来检查 useEffect 的流量,我认为它在无限循环,一遍又一遍地寻找变化。我假设发生这种情况是因为每当 useEffect 运行时,它都会“设置”messages 数组,从而使其再次运行。
我可以通过从依赖数组中删除“messages”来解决循环问题,但问题是在发送或接收新消息时它不会再次呈现。所以我不确定我应该怎么做。
PS:聊天取决于实际的用户 ID,开始的条件是确保收到 ID,否则不应查询 firestore db。
【问题讨论】:
-
嗨。在推送消息并调用 setMessages 之前,我们能否不检查检索到的消息是否已经在 messagesArray 中?我们无法从依赖项中删除消息,但我们可以检查检索到的消息是否已经存在
-
我不确定如何实现这一点,我对编程有点陌生。你的意思是,以某种方式获取 messagesArray 的值,并将其与状态中的新消息进行比较?我不知道我怎么能这样做
标签: reactjs firebase react-native google-cloud-firestore react-hooks