我正在创建一个博客类型的应用程序与云firestore只是作为一个项目来学习一些东西。然而,我有一个问题,只有我的状态数组的最后一个元素,'blogs',正在返回。map方法内部。
任何帮助这是赞赏的,谢谢!
const [blogs, setBlog] = useState([]);
const fetchBlogs = async () => {
const response = await getDocs(collection(db, "blog posts"));
let postArray = [];
response.docs.forEach((blogpost) => {
postArray.push(blogpost.data());
});
console.log(postArray)
postArray.forEach(post => {
setBlog([...blogs, post]);
});
}
useEffect(() => {
fetchBlogs();
}, []);
return (
<ul className="posts-container">
{ blogs.map((blog) => {
console.log(blog); //this outputs each of the individual posts, but only the last is displayed as an <li>
return ( <li key={blog.title}>{blog.title}</li> )
})}
</ul>
)
您可能希望在不执行forEach()
的情况下将响应放在您的状态
setBlog(postArray);
甚至
(取决于数据结构)const [blogs, setBlog] = useState([]);
const fetchBlogs = async () => {
const response = await getDocs(collection(db, "blog posts"));
setBlog(response.data); // set to whatever you need
}
useEffect(() => {
fetchBlogs();
}, []);
return (
<ul className="posts-container">
{ blogs.map((blog) => {
return <li>( <li key={blog.title}>{blog.title}</li> )
}
)}
</ul>
);
而不是:
postArray.forEach(post => {
setBlog([...blogs, post]);
});
试试这样做:
setBlog(postArray);
我不确定到底发生了什么,但这似乎是你的代码中最可疑的部分。
你重写了两次博客文章,试试这种方式
const fetchBlogs = async () => {
const response = await getDocs(collection(db, "blog posts"));
setBlog([...blogs, ...response.docs.map(blogpost => blogpost.data())])
}
useEffect(() => fetchBlogs(), []);