-
리액트 캘린더 라이브러리 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가 있어서 찾아내어 스타일을 적용시켜줄 수 있었다.
처음 써보는 캘린더 라이브러리인데 너무 잘 해내어 만족스럽고
프로젝트를 진행할수록 성장하고 있음이 느껴져서 뿌듯하다.
더 잘하고 싶다!
'프론트엔드 개발자가 될거야. > 라이브러리' 카테고리의 다른 글
[React-i18next] 웹페이지에 '더 효율적으로' 다국어 적용하기 (with: typescript) (0) 2023.03.09 [React-i18next] 웹페이지에 다국어 적용하기 (with: typescript) (0) 2023.03.02 [Framer Motion] animation의 최강자 Framer Motion 알아보기, Animation/Variants/Gestures/Drag (0) 2023.01.08 [react-beautiful-dnd] 칸반보드 만들기, react-beautiful-dnd 상세설명 (0) 2023.01.07