프론트엔드 개발자가 될거야./라이브러리

리액트 캘린더 라이브러리 Datepicker 사용법, 커스텀하기

정니정은니 2022. 8. 7. 22:17

제주패스를 클론코딩하면서

내가 맡았던 부분에서 가장 도전적인 부분은 캘린더 라이브러리를 사용하는 것 이었다.

라이브러리라는 것을 처음 시도해보았기 때문이다.

일단 결과물부터 보여주자면

출발일, 도착일을 선택하면 탑승일에 해당 날짜가 표시되고

검색 버튼도 편도면 편도, 왕복이면 왕복으로 잘 구현된다.

또한 캘린더도 커스텀하여 화이트 앤 블루로 스타일링했다.


다운로드 하는 법   https://www.npmjs.com/package/react-datepicker

 

react-datepicker

A simple and reusable datepicker component for React. Latest version: 4.8.0, last published: 3 months ago. Start using react-datepicker in your project by running `npm i react-datepicker`. There are 2146 other projects in the npm registry using react-datep

www.npmjs.com

위의 npm사이트에서 볼 수 있듯

npm install react-datepicker --save

이렇게 datepicker를 다운받아주고

 

공식문서   https://reactdatepicker.com/

 

React Datepicker crafted by HackerOne

 

reactdatepicker.com

공식문서에 여러 예시가 많이 나와있으니 원하는 스타일로 복붙하면 된다.

나는 연속된 두 개의 월이 나오는 캘린더가 필요하여 'Multiple months' 기능이 되는 걸로 가져왔다.


내 Datepicker 코드

import React, { useState } from 'react';
import styled from 'styled-components';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';
import { ko } from 'date-fns/esm/locale'; // 캘린더를 한국어로 바꾸기위해 필요

const Dep = () => {
  const [startDate, setStartDate] = useState(new Date());
  const [endDate, setEndDate] = useState(null);
	  
  const onChange = dates => {
    const [start, end] = dates;
    setStartDate(start);
    setEndDate(end);
  
  	function setBoardDate(startOrEnd) {
      const year = startOrEnd.getFullYear().toString().slice(2);
      const month = startOrEnd.getMonth() + 1;
      const day = startOrEnd.getDate();
      const weekday = startOrEnd.toString().slice(0, 3);
      const weekdayToKo = WEEKDAY_TO_KO.map(data => {
        return data[weekday];
      });
      const finalDate = `${year}.${month >= 10 ? month : '0' + month}.${
        day >= 10 ? day : '0' + day
      }(${weekdayToKo})`;
      return finalDate;
    }
    
    // 위에서 가공한 값을 다른component에서 state로 활용하고 있다.
    dispatch(setBoardStartDay(setBoardDate(start)));
    dispatch(setBoardEndDay(setBoardDate(end)));
    dispatch(
      setBoardDate(start) === setBoardDate(end)
        ? setSearch('편도')
        : setSearch('왕복')
    );
   };

  return (
    <ArriveDiv>
      <RightDiv>
        <p>항공편 날짜를</p>
        <p>선택하세요.</p>
      </RightDiv>
      <LeftDiv>
        <DatePicker
          selected={startDate}
          // 날짜 누를 때의 이벤트를 식별하기 위한 onChange이벤트 속성
          onChange={onChange}
          startDate={startDate}
          endDate={endDate}
          // 범위가 선택되는 selectsRange 속성
          selectsRange
          // input박스 대신 캘린더만 나오게 해주는 inline 속성
          inline
          // 캘린더를 2개 보여주는 monthsShown 속성
          monthsShown={2}
          // 캘린더를 한국어로 바꿔주는 locale 속성
          locale={ko}
          // 최소 날짜를 오늘 날짜로 설정해주는 minDate 속성
          minDate={new Date()}
        />
      </LeftDiv>
    </ArriveDiv>
  );
};

const ArriveDiv = styled.div`
  display: flex;
  justify-content: center;
  height: 500px;
  background-color: #fff;
`;

const RightDiv = styled.div`
  width: 260px;
  height: 100%;
  background-color: #fff;
  padding-top: 48px;
  border-right: 1px solid #eaeaea;
  p {
    line-height: 1.7rem;
    font-size: 24px;
    font-weight: bold;
  }
`;

const LeftDiv = styled.div`
  width: 800px;
  height: 100%;
  padding-top: 48px;
  padding-left: 28px;
  padding-right: 25px;
  background-color: #fff;
  border-bottom: 1px solid #eaeaea;
  border-right: 1px solid #eaeaea;
  .react-datepicker {
    border: 0px;
    line-height: 1.5rem;
  }
  .react-datepicker__month-container {
    width: 320px;
  }
  .react-datepicker__header {
    background-color: #fff;
    border: 0px;
  }
  .react-datepicker__day--selected,
  .react-datepicker__day--keyboard-selected,
  .react-datepicker__day--in-range,
  .react-datepicker__day--in-selecting-range {
    border-radius: 1rem;
    background-color: #63a2ff;
    color: #fff;
  }
`;

export default Dep;

onchange함수에 많은 수식들이 있는데 이는 date함수를 가공하여 

이렇게 탑승일에 원하는 형식으로 넣어주고 있다.

 

또한 styled-component로 커스텀해준 것을 볼 수 있는데

만약 커스텀을 하지 않는다면

이렇게 조금은 못생긴..(?) 캘린더가 나온다.

커스텀해주면 이렇게 원하는 형태로 커스텀 할 수 있다!

처음에는 도대체 어떻게 스타일을 만져야하는 건지 감이 전혀 오지 않았는데

개발자도구로 보니 이렇게 하나하나 class가 있어서 찾아내어 스타일을 적용시켜줄 수 있었다.


처음 써보는 캘린더 라이브러리인데 너무 잘 해내어 만족스럽고

프로젝트를 진행할수록 성장하고 있음이 느껴져서 뿌듯하다.

더 잘하고 싶다!