Firebaseから得た入力が重複して表示される
Q&A
Closed
解決したいこと
ユーザーがブックマークした一覧を重複なしで一つだけ表示されるようにしたい。
発生している問題・エラー
Firebase Firestoreに保存されているブックマーク済みの投稿データを取得し、そのデータをまとめて表示するために書いたコードです。以下の画像参照していただければ分かる通り、同じ内容のブックマーク一覧が何回も繰り返し表示されるようになってしまいました。
該当するソースコード
import { useState, useEffect, memo } from "react";
import { db } from "@/firebase/firebase";
import { collection, query, orderBy, onSnapshot } from "firebase/firestore";
import { useRouter } from "next/navigation";
import { doc, deleteDoc } from "firebase/firestore";
const BookmarkItem = memo(({ post, onDelete }) => {
return (
{post.title}
{post.comment}
{post.artist?.name || "アーティスト未選択"}
{post.artist?.imageUrl && (BookmarkItem.displayName = 'BookmarkItem';
export default function BookmarksPage() {
const [bookmarkedPosts,setBookmarkedPosts] = useState([]);
const router = useRouter();
useEffect(() => {
const q = query(collection(db, "bookmarks"), orderBy("createdAt", "desc"));
const unsubscribe = onSnapshot(q, (snapshot) => {
const updatedPosts = snapshot.docs.map((doc) => ({
...doc.data(),
id: doc.id,
}));
// ユニークなデータを取得
const uniquePosts = updatedPosts.filter((value, index, self) =>
index === self.findIndex((t) => t.id === value.id)
);
setBookmarkedPosts(uniquePosts);
}, (error) => {
console.error("Snapshot error:", error);
});
return () => {
unsubscribe();
};
},[]);
const handleDeleteBookmark = async (bookmarkId) => {
try {
const bookmarkDocRef = doc(db, "bookmarks", bookmarkId);
await deleteDoc(bookmarkDocRef);
// ローカル状態の更新
setBookmarkedPosts((prevPosts) => prevPosts.filter((post) => post.id !== bookmarkId));
alert("ブックマークを削除しました!")
} catch (error) {
console.error("削除エラー:", error.message);
}
};
return (
ブックマーク一覧
自分で試したこと
1 Firebase onSnapShotがレンダリングの際に多重登録されてるか
2 Keyが一意であるか
3 useEffectの依存配列を確認
4再レンダリング時に再実行されるないかを確認するためにuseEffectの依存配列が [] になっているか確認(useEffectの中にconsole.logを仕込んで、コンソール上でいつ発火しているかを確認)
など様々な可能性を考えて修正してみましたが一向に解決しませんでした。