typescript
속성이 다른 데이터들을 같은 구성으로 렌더링하기
becky(지은)
2023. 7. 23. 01:40
console.log(combinedData); 찍으니 이제 date별로 data가 나오게 되었다.
하지만 각자 속성이 다른 계좌 데이터와 현금 데이터...
리턴문으로 렌더링할때 조금 신경을 써줘야 했다
export default function MonthConsumptionDetail({
combinedData,
}: {
combinedData: CombinedData[];
}) {
const detailBoxRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (detailBoxRef.current) {
const itemCount =
combinedData?.reduce(
(height, group) => height + group.data.length,
0
) || 0;
const 날짜갯수 = combinedData.length;
const calculatedHeight = (itemCount + 날짜갯수 * 2 - 7) * 5;
detailBoxRef.current.style.height = `${calculatedHeight}vh`;
//console.log(itemCount)
}
}, [combinedData]);
return combinedData.length === 0 ? (
<없다>소비 내역이 없습니다.</없다>
) : (
<ConsumptionDetailBox ref={detailBoxRef}>
{combinedData.map((group, index) => (
<ConsumptionDetailContainer key={index}>
<DateContainer>{parseInt(group.date.split("-")[2])}일</DateContainer>
{group.data.map((item) => renderItem(item))}
{/* <DayItem>
<NameContainer>
<img src={dot} alt="icon" />
<div className="title">{item.}</div>
</NameContainer>
<PriceContainer>
<div className="price">{item.}</div>
<div className="source">{item.}</div>
</PriceContainer>
</DayItem>*/}
</ConsumptionDetailContainer>
))}
</ConsumptionDetailBox>
);
}
function renderItem(item: CombinedItem) {
if ("bankName" in item) {
//계좌 데이터 처리
return (
<DayItem>
<NameContainer>
<img src={dot} alt="icon" />
<div className="title">{item.paymentResponse.purpose}</div>
</NameContainer>
<PriceContainer>
<div className="price">{item.paymentResponse.amount}</div>
<div className="source">{item.bankName}</div>
</PriceContainer>
</DayItem>
);
} else {
return (
<DayItem>
<NameContainer>
<img src={dot} alt="icon" />
<div className="title">{item.purpose}</div>
</NameContainer>
<PriceContainer>
<div className="price">{item.amount}</div>
<div className="source">{item.paymentType}</div>
</PriceContainer>
</DayItem>
);
}
}
방법은 renderItem이라는 함수로 따로 빼서,
특정 속성이 있는 경우와 없는 경우로 나누어서
리턴문을 다르게 작성하는 것이다 ^^
이렇게 처리하면 데이터의 속성이 일치하지 않아도
화면상에 같은 구성으로 렌더링 할 수 있다..