개요
react-datepicker
를 이용해 아래와 같은 페이지를 만들어 본다.
- 별도의 클릭 없이 처음부터 달력이 나오는 페이지 (inline 스타일)
- 날짜 레이블을 누르면 달력이 나오는 페이지
결과물
- 만드는 김에 하나는 한국어로, 하나는 영어(default)로 만들어봤다. 지역 설정만 해 주면 되니까 쉽지만 날짜 정보 스타일이 지역마다 달라지는 것에는 유의해야 한다.
- 주말 날짜에 색을, 오늘 날짜에는 배경에 보라색 동그라미를 입히고 특정 날짜들은 회색 동그라미가 뜨게 커스텀했다.
ver 1. Inline 스타일

ver 2. 날짜 레이블을 누르면 달력이 뜨는 스타일

참고
import
- 별도의 css 커스텀을 할 예정이라도 기본 css는 import해줘야 함
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
1. Inline 달력
Datepicker 코드
- 공식문서와 큰 차이는 없다.
- 대신 나는 highlight된 날짜와 아닌 날짜에 대한 css 처리를 다르게 해 줘야 했기 때문에
useRef
를 추가로 사용했다.
highlightDates
에 대한 정보를 백엔드에서 불러오면 그 정보를 DatePicker
의 highlightDates
속성에 넣어줘서 일기가 있는 페이지의 날짜는 회색 동그라미가 그려지게 했다.
(아래 코드에 들어간 날짜 배열은 프론트 only 환경 테스트용)
const [startDate, setStartDate] = useState(new window.Date());
const calRef = useRef();
...
return(
<DatePicker
onChange={(date)=>onDatePickHandler(date)}
selected={startDate}
highlightDates={[new Date('2023-02-12'), new Date('2023-02-11') ]}
ref={calRef}
inline
/>
);
날짜 클릭시의 핸들러
- 앞에서 언급했듯 highlight된 날짜와 아닌 날짜에 대한 처리를 다르게 하기 위한 처리가 들어가 있다.
- 지금 생각해보니 굳이
useRef
를 쓰지 말고 백엔드에서 받은 정보를 토대로 처리하는 게 좀 더 깔끔할 것 같다.
- 아무튼
DatePicker
를 사용할 때 직접 DOM에 접근해서 정보를 가져오고 싶다면 useRef
를 사용해 아래와 같이 불러오면 된다.
const onDatePickHandler = (date) => {
setStartDate(date);
const highlightDates = calRef.current.state.highlightDates;
if(highlightDates.has(dateToStringForSearch(date))===true){
}else{
}
- 위의 코드에서 사용했던 함수로, 달력에서 선택한 날짜가 highlighted인 상태인지 알아보기 위해 선택한 날짜(Date 객체 형식)를 highlighted에 저장되는 형식으로 변환한다.
- 참고로 달력 지역 설정을 한국으로 하면
연도.월.일
스타일로 들어가니까 return 부분을 수정해줘야 한다.
const dateToStringForSearch = (d) => {
const year = d.getFullYear();
const month = d.getMonth() + 1;
const date = d.getDate();
return `${month >= 10 ? month : "0" + month}.${date >= 10 ? date : "0"+date}.${year}`;
};
css
- 직접 개발자 도구에서 이름 뒤져가면서 커스텀하면 된다.
- 전체 코드를 첨부할까 하다가 내 css 코드는 달력을 감싸는 레이아웃이 없으면 바로 깨지는 것을 보고 그냥 자주 쓸만한 일부 클래스 이름들만 적어두기로 했다.
.react-datepicker {
}
.react-datepicker__month-container {
}
.react-datepicker__header{
}
.react-datepicker__current-month{
}
.react-datepicker__day-name{
}
.react-datepicker__month{
}
.react-datepicker__day:nth-child(1){
color:red;
}
.react-datepicker__day:nth-child(7){
color:#8685FF;
}
.react-datepicker__day-name:nth-child(1){
color: #FF5555;
}
.react-datepicker__day-name:nth-child(7){
color:#8685FF;
}
.react-datepicker__day{
}
.react-datepicker__day--selected{
}
.react-datepicker__day--highlighted{
}
.react-datepicker__day:hover {
}
2. Label 스타일
- 달력 스타일은 위와 공유하므로 그냥 label 들어가는 스타일대로 작성해주면 된다. label만 styled component로 커스텀해줬다.
- 레이블에 날짜만 들어가면 허전해서 달력 이모티콘을
dateFormat
마지막에 직접 넣어줬다.
const DateInput = styled(DatePicker)`
margin-bottom: 10px;
border: none;
font-size: 15px;
color: #aeaeae;
&:focus {
outline: 0;
}
`;
<DateInput
showIcon
selected={startDate}
onChange={(date) => setStartDate(date)}
dateFormat="yyyy/MM/dd 📆"
/>