New date를 사용한 주간 달력 커스텀
1. 필요한 데이터 변수에 저장하기
const date = new Date();
const todayWeak = date.getDay();
const today = date.getDate();
const lastday = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
2. 일수 가져오는 함수(1,2,3,4 ...)
const getAlldate = (today: number, lastday: number) => {
const dates = [];
dates[0] = today;
for (let i = 1; i <= 13; i++) {
today++;
if (today > lastday) {
today = 1;
dates.push(today);
}
else {
dates.push(today);
}
}
return dates;
};
3. 요일 가져오는 함수
const getAllweak = (todayWeak: number) => {
const strWeak = ['일', '월', '화', '수', '목', '금', '토'];
const weaklist = [];
weaklist[0] = '오늘';
for (let i = 1; i <= 13; i++) {
todayWeak++;
if (todayWeak > 6) {
todayWeak = 0;
weaklist[i] = strWeak[todayWeak];
} else if (weaklist[0] === '오늘' && weaklist[1] !== '내일') {
weaklist[i] = '내일';
} else {
weaklist[i] = strWeak[todayWeak];
}
}
return weaklist;
};
4. 맵핑을 위한 배열안에 객체로 데이터 관리하기
2번과 3번에서 만든 함수 리턴값이 배열이기때문에 변수에 값을 담아주고 1번에 데이터를 함수 인자로 넘겨준다. 그후 동일한 키값을 가진 객체가 만들어지기 때문에 반복문을 활용해준다.
const CalendarDay = getAlldate(today, lastday);
const CalendarWeak = getAllweak(todayWeak);
const [CalendarObject, setCalendarObject] = useState<{ weak: string; day: number }[]>([]);
const getCalendar = () => {
const CalendarObjects = [];
for (let i = 0; i <= 13; i++) {
CalendarObjects.push({ weak: CalendarWeak[i], day: CalendarDay[i] });
}
setCalendarObject(CalendarObjects);
};
useEffect(() => {
getCalendar();
}, []);
5. 마무리 맵핑하기
맵핑시 ContentLi스타일드 컴포넌트에 클래스네임을 삼항 연산자로 주었다.
- active는 선택했는지 여부 파악이고 중요한건
토요일
과 일요일
색 변환을 위한 클래스네임 삼항연산자이다.
<ContainerUl>
{CalendarObject.map((el, idx) => (
<button key={idx} onClick={() => onClickHandler(idx)}>
<ContentLi
className={
curIdx === idx
? `active ${el.weak === '토' ? 'sat' : el.weak === '일' ? 'sun' : ''}`
: el.weak === '토'
? 'sat'
: el.weak === '일'
? 'sun'
: ''
}
>
<span className="day" ref={el => (WeakRefs.current[idx] = el)}>
{el.day}
</span>
<span className="weak">{el.weak}</span>
</ContentLi>
</button>
))}
</ContainerUl>
완성후
참고 블로그
블로그