{date.map((item) => {
// 전년도일때
if (item.year < today.year && item.day === 0) {
return (
<St.Sunday
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Sunday>
);
} else if (item.year < today.year) {
return (
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
);
}
// 올해 && 이전달일때
else if (
item.year === today.year &&
item.month < today.month &&
item.day === 0
) {
return (
<St.Sunday
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Sunday>
);
} else if (item.year === today.year && item.month < today.month) {
return (
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
);
}
// 이번달 오늘까지
else if (
item.year === today.year &&
item.month === today.month &&
Number(item.date) <= Number(today.date) &&
item.day === 0
) {
return (
<St.Sunday
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Sunday>
);
} else if (
item.year === today.year &&
item.month === today.month &&
Number(item.date) <= Number(today.date)
) {
return (
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
);
} else if (item.day === 0) {
return <St.Sunday key={item.date}>{item.date}</St.Sunday>;
} else {
return <St.Day key={item.date}>{item.date}</St.Day>;
}
})}
// 아이콘 버튼이 있는 부분
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
day={item.day}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
// 아이콘 버튼이 없는 부분
<St.Day key={item.date} day={item.day}>
{item.date}
</St.Day>
스타일드 컴포넌트에 day(요일)값을 props로 내려주어 0이면 빨강색, 6이면 파란색을 color로 설정하여 Day라는 스타일드 컴포넌트 하나만으로 요일별 글자 색 변경을 가능하게 함. ⇒ 기존에는 일요일만 표현했지만 토요일까지 표현할 수 있었음
그런데, 여기서 3번이나 반복되는 return값을 어떻게 줄일 수 있을지에 대해 고민하게 됨.
// 반복되는 부분
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
day={item.day}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
여러개의 조건문들(전년도일때, 올해 && 이전달일때, 이번달 오늘까지)을 하나의 조건문으로 처리해줄 수 있다면, return부분의 스타일드 컴포넌트를 한 번만 작성해도 될 것 같다는 생각이 들었음.
{date.map((item) => {
if (
today.year < item.year ||
(today.year === item.year && today.month < item.month) ||
(today.year === item.year &&
today.month === item.month &&
Number(item.date) > Number(today.date))
) {
return (
<St.Day key={item.date} day={item.day}>
{item.date}
</St.Day>
);
} else {
return (
<St.Day
key={item.date}
onClick={() => clickDayBtn(Number(item.date))}
day={item.day}
>
{item.date}
<CalendarEmo data={data} item={item} today={today} />
</St.Day>
);
}
오늘 이전의 날짜를 먼저 제해주는 것이 아닌, 오늘 이후의 날짜를 제해주고 그게 아닐 시에 글작성 버튼이 나타날 수 있도록 만들고자 함. 즉, 처음 코드의 예외처리 순서를 reverse 해보기로 함.
today.year < item.year
today.year === item.year && today.month < item.month
today.year === item.year && today.month === item.month && Number(item.date) > Number(today.date)
&&
를 걸어주고 세 가지를 합쳐주기 위해 ||
사용함. 각각의 부분들을 구분하는 것을 명시하기 위해 소괄호로 묶어줌.