前提・実現したいこと
React.jsとFirebaseを使って掲示板を作っています。
掲示板の機能は下記の通りです。
- ユーザー登録およびログインしていなくても、掲示板に投稿できる
- ログイン状態で投稿すると、投稿に対してユーザーの名前が添えられる
- ユーザー情報を更新すると、投稿に添えられた名前も更新される
以上です。
現状はユーザーの名前を格納するUsers
コレクション(ドキュメントのIDはuid)と、本文とuidを格納するPosts
コレクションを作成しています。
上記の機能の場合におけるFirestore
の設計を教えていただきたいです。
現状のソースコード
処理の流れは下記の通りです。
Posts
コレクションを取得して配列に格納し、array.map()
でレンダーarray.map()
の各オブジェクトを子コンポーネントPost
に渡すPost
コンポーネントで、渡されたオブジェクトから本文を表示、オブジェクトにuid
があればUsers
コレクションからuid
を使いデータを取得して表示
コレクションの取得は、react-firebase-hooksというライブラリを使用しています。
PostList.js
js
1import { useCollectionData } from "react-firebase-hooks/firestore"; 2 3const PostList = () => { 4 const postsArray = useCollectionData(db.collection("posts"))[0]; 5 6 const posts = postsArray.map((postObj, index) => ( 7 <Post postObj={postObj} key={index} /> 8 )); 9 10 return <div>{posts}</div>; 11};
Post.js
js
1const Post = ({ postObj }) => { 2 const [user, setUser] = useState(); 3 useEffect(() => { 4 if (!postObj.uid) return; 5 db.collection("users").doc(postObj.uid) 6 .onSnapshot(doc => setUser(doc.data())); 7 }, [postObj.uid]); 8 9 return ( 10 <> 11 <p>{postObj.text}</p> 12 {user&& <span>{userData.name}</span>} 13 </> 14 ); 15};
上記コードでの問題点
ユーザー情報が無いはずの投稿にユーザー情報が付いたり逆に付かなかったりなど、投稿とユーザー情報の紐付けに齟齬が生じます。
初回レンダー時は正常に紐付けられレンダーされますが、投稿すると上記の齟齬が生じます。
齟齬の原因は、ユーザー情報の取得を待たずして投稿がレンダーされるからかと思われます。
とはいえ現状のFirestore
の設計ではこの問題を解決する方法が考えられないため、Firestore
の設計から作り直せば問題を解決できると考え、質問した次第です。
あなたの回答
tips
プレビュー