#javascript #reactjs #firebase #google-cloud-firestore
#javascript #reactjs #firebase #google-облако-firestore
Вопрос:
Мне нужна некоторая помощь с React и Firestore.
Каким-то образом, когда я получаю данные из firestore и регистрирую их в консоли, данные регистрируются дважды. И когда я присваиваю данные из firestore переменной blog с помощью useState, вся функция переходит в бесконечный цикл.
Вот код:
import React, { useState, useEffect } from 'react';
import { projectFirestore } from '../../firebase/config';
const Blogs = () => {
const [blog, setBlog] = useState([])
useEffect(() => {
projectFirestore
.collection("Blogs")
.get()
.then(querySnapshot => {
querySnapshot.forEach((doc) => {
const data = doc.data()
console.log(data)
});
});
}, [blog])
return (
<div>
Blogs
</div>
)
}
export default Blogs
Любые предложения о том, почему данные продолжают дважды регистрироваться в журнале и почему они продолжают попадать в бесконечный цикл, когда я пытаюсь использовать useState? Спасибо за любую помощь
Комментарии:
1. Удалите переменную blog из массива зависимостей useEffect, потому что эффект запускается при первом рендеринге и переводит данные блога в состояние, но если вы поместите блог в массив зависимостей, эффект будет перезапущен на страницах блога, и вы получите цикл inf, потому что эффект устанавливает состояние,состояние меняется и снова.
2. Я удалил его и остался прежним.
3. Вы получаете бесконечный цикл или двойной журнал? Кстати, я не вижу метод setBlog (data).
4. setBlog(данные) должен идти сразу после console.log(данные). Двойной журнал был устранен с помощью эффекта useEffect, я просто забыл упомянуть об этом. Моя вина.
5. не могли бы вы тогда решить проблему?
Ответ №1:
В этой форме вы не должны получать бесконечный цикл в useEffect.
const [blog, setBlog] = useState<Array<{}>>([])
useEffect(() => {
projectFirestore
.collection("Blogs")
.get()
.then(querySnapshot => {
querySnapshot.forEach((doc) => {
const data = doc.data()
console.log(data)
setBlog(prevState => [...prevState, data])
});
});
}, [])