Я пытаюсь выяснить, как использовать реакцию useEffect для получения данных из хранилища.
Это моя текущая попытка.
import React, { useHook, useEffect, useState } from 'react';
import {
useParams
} from 'react-router-dom';
import Firebase from "../../../firebase";
const ReadBlogPost = async () => {
const [loading, setLoading] = useState(true);
const [currentPost, setCurrentPost] = useState([]);
let { slug } = useParams();
useEffect(() => {
Firebase
.firestore
.collection("blog")
.doc(slug)
.get()
.then(function(doc) {
if (doc.exists) {
// setCurrentPost(doc.data());
console.log("Document data:", doc.data());
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
})
.catch(function(error) {
console.log("Error getting document:", error);
}), []
})
return (
<div>
{currentPost.title}
</div>
)
};
export default ReadBlogPost;
Пустой массив в конце является попыткой чтобы попытаться убедиться, что реакция не использует все разрешения на чтение в хранилище, которые были подробно описаны в этой публикации и этой проблеме .
Когда я пытаюсь это сделать, Я получаю сообщение об ошибке:
Строка 19:11: ожидал присваивания или вызова функции и вместо этого увидел выражение no-unused-expressio
Файл jsx , Я видел этот пост и этот , что означает, что я должен преобразовать оператор if в троичное условие.
Моя попытка изменить это на троичное выражение:
useEffect(() => {
Firebase
.firestore
.collection("blog")
.doc(slug)
.get()
.then(function(doc) {
doc.exists? setCurrentPost(doc.data()) : console.log("No such document!")
})
.catch(function(error) {
console.log("Error getting document:", error);
}), []
})
Когда я пытаюсь это сделать, я получаю то же сообщение об ошибке, что и при использовании оператора if.
Может ли кто-нибудь помочь с примером использования useEffect для чтения данных пожарного хранилища ( один раз) в файле jsx?
СЛЕДУЮЩАЯ ПОПЫТКА Используя предложение Николаса, я изменил useEffect на:
useEffect(() => {
Firebase
.firestore
.collection("blog")
.doc(slug)
.get()
.then(function(doc) {
doc.exists? setCurrentPost(doc.data()) : console.log("No such document!")
.catch(function(error) {
console.log("Error getting document:", error)
})
}, [])
})
Это приводит к ошибке, которая говорит:
Ошибка: объекты недопустимы как дочерние элементы React (найдено: [обещание объекта]). Если вы хотите визуализировать коллекцию дочерних элементов, используйте вместо этого массив.
СЛЕДУЮЩАЯ ПОПЫТКА
Я попробовал предложение Бена - изменить объект в currentPost обратно на массив, но я получаю ту же ошибку, что и я, когда пытаюсь предложить предложение Николаса.
Затем я попытался объединить их биты так:
import React, { useHook, useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import Firebase from "../../../firebase";
const ReadBlogPost = async () => {
let { slug } = useParams();
const [loading, setLoading] = useState(true);
const [currentPost, setCurrentPost] = useState([]);
useEffect(() => {
const fetchData = async() => {
try {
const response = await Firebase.firestore
.collection("blog")
.doc(slug)
.get()
.then(function(doc) {
doc.exists? setCurrentPost(doc.data()) : console.log("No such document!")
})
} catch(err) {
console.error(err);
}
};
fetchData();
}, []);
return (
<div>
{!loading &&
currentPost.title}
</div>
)
};
export default ReadBlogPost;
Я все еще получаю то же самое ошибка.
Ошибка: объекты недопустимы как дочерний элемент React (найдено: [обещание объекта]). Если вы хотите отобразить коллекцию дочерних элементов, используйте вместо этого массив. в ReadBlogPost (создан Context.Consumer)
Я не знаю, есть ли в этом ключ, но ссылка на ReadBlogPost предполагает, что у меня где-то есть потребитель контекста. Я еще не создал контекст - поэтому не уверен, что он ищет, чтобы можно было использовать useEffect?