From 1a0b1c4c4827a769ad8af3284e2ef94ff21f422c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=B3=91=EC=B2=A0?= Date: Thu, 22 Jan 2026 23:22:09 +0900 Subject: [PATCH] =?UTF-8?q?fix(WEB):=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=ED=94=BC=EB=8B=88=ED=8B=B0=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=A4=91=EB=B3=B5=20key=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 데이터 누적 시 getItemId로 중복 항목 필터링 - 페이지 전환 시 동일 데이터 중복 추가 방지 Co-Authored-By: Claude --- src/components/templates/IntegratedListTemplateV2.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/templates/IntegratedListTemplateV2.tsx b/src/components/templates/IntegratedListTemplateV2.tsx index 74cb922c..31d99d84 100644 --- a/src/components/templates/IntegratedListTemplateV2.tsx +++ b/src/components/templates/IntegratedListTemplateV2.tsx @@ -300,15 +300,19 @@ export function IntegratedListTemplateV2({ setAccumulatedMobileData(data); setLastAccumulatedPage(1); } else if (pagination.currentPage === lastAccumulatedPage + 1) { - // 다음 페이지: 기존 데이터에 누적 - setAccumulatedMobileData(prev => [...prev, ...data]); + // 다음 페이지: 기존 데이터에 누적 (중복 제거) + setAccumulatedMobileData(prev => { + const existingIds = new Set(prev.map(item => getItemId(item))); + const newItems = data.filter(item => !existingIds.has(getItemId(item))); + return [...prev, ...newItems]; + }); setLastAccumulatedPage(pagination.currentPage); } else if (pagination.currentPage !== lastAccumulatedPage) { // 페이지 점프 (예: PC에서 페이지 변경 후 모바일로): 현재 데이터만 표시 setAccumulatedMobileData(data); setLastAccumulatedPage(pagination.currentPage); } - }, [data, pagination.currentPage, pagination.totalItems, allData, enableMobileInfinityScroll, lastAccumulatedPage]); + }, [data, pagination.currentPage, pagination.totalItems, allData, enableMobileInfinityScroll, lastAccumulatedPage, getItemId]); // 탭 변경 감지: activeTab 변경 시 누적 데이터 리셋 // 주의: allData를 dependency에 넣으면 페이지 변경 시마다 리셋됨 (외부 훅 사용 시)