【发布时间】:2022-01-13 21:25:15
【问题描述】:
我该怎么做?我无法从我在这里找到的其他任何东西中弄清楚。
背景
我在 Firestore 中有 posts 和 users 的集合。信息将被渲染到一个帖子组件中,在仪表板上显示所有现有帖子。
用户收藏
users 拥有一个存储图像 URL 的 avatar 属性。每个用户的 doc id 只是他们的用户名,因为它们是唯一的。
帖子收藏
posts 有一个与username/doc.id 完全相同的author 属性
目标
在遍历posts 时,我想将它们推送到一个数组并存储它们的id 和其余的post 数据。我还需要将其与users 集合相关联,并在每次迭代中找到与post author 匹配的user 的avatar。
我已经尝试过的事情
我尝试在forEach 循环中使用async/await,使用post.author 值来获取正确的user document 并拉动avatar。
Posts组件代码
import { useEffect, useState } from "react"
import { Link } from "react-router-dom"
import { collection, onSnapshot /*doc, getDoc*/ } from "firebase/firestore"
import { db } from "lib/firebase"
import AllPostsSkeleton from "components/Skeletons/AllPostsSkeleton"
import Tags from "components/Tags"
import defaultAvatar from "assets/images/avatar_placeholder.png"
const Posts = () => {
const [loading, setLoading] = useState(true)
const [posts, setPosts] = useState(null)
useEffect(() => {
const unsubscribe = onSnapshot(
collection(db, "posts"),
(docs) => {
let postsArray = []
docs.forEach((post) => {
// const docRef = doc(db, "users", post.author)
// const docSnap = await getDoc(docRef)
postsArray.push({
id: post.id,
// avatar: docSnap.data().avatar,
...post.data(),
})
})
setPosts(postsArray)
},
(error) => {
console.log(error)
}
)
setLoading(false)
return () => unsubscribe()
}, [])
if (loading) return <AllPostsSkeleton />
if (!posts) return <div className="no-posts">No posts to show</div>
const RenderPosts = () => {
const sortedPosts = posts.sort((a, b) => {
return new Date(b.date.seconds) - new Date(a.date.seconds)
})
return sortedPosts.map(
({ id, author, slug, content, tags, comment_count, avatar }) => (
<article className="post-preview media" key={id}>
<figure className="media-left">
<p className="comment-avatar image is-96x96">
<img src={avatar || defaultAvatar} alt={content.title} />
</p>
</figure>
<div className="media-content">
<div className="content">
<header className="post-header">
<h2 className="title is-3">
<Link to={`/user/${author}/posts/${slug}`}>
{content.title}
</Link>
</h2>
<div className="tags">
<Tags data={tags} />
</div>
</header>
<p className="post-excerpt">{content.excerpt}</p>
<footer className="post-footer">
Posted by
<Link to={`/user/${author}`} className="capitalise">
{author}
</Link>
| <Link to={`/user/${author}/posts/${slug}`}>View Post</Link>
</footer>
<div className="content">
<Link to={`/user/${author}/posts/${slug}#comments`}>
Comments ({comment_count})
</Link>
</div>
</div>
</div>
</article>
)
)
}
return (
<div className="posts-list">
<RenderPosts />
</div>
)
}
export default Posts
【问题讨论】:
标签: javascript reactjs firebase google-cloud-firestore