๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

[React] react-datepicker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ํ•˜๊ธฐ(์บ˜๋ฆฐ๋”, ๋‹ฌ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ์— ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ•˜๋Š” ์›น์•ฑ์„ ํด๋ก  ์ฝ”๋”ฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ธฐ๊ฐ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Input์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์บ˜๋ฆฐ๋”๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์บ˜๋ฆฐ๋”์—์„œ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•˜๋ฉด Input์— ํ•ด๋‹น ๋‚ ์งœ๊ฐ€ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์บ˜๋ฆฐ๋”๋ฅผ ์ผ์ผ์ด ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฑฐ ๊ฐ™์•„์„œ, ๋ฆฌ์•กํŠธ ์บ˜๋ฆฐ๋” ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋ณด๋˜ ์ค‘์—

react-datepicker๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊ป ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์บ˜๋ฆฐ๋” ๊ด€๋ จํ•ด์„œ๋Š” ์ฒ˜์Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

react-datepicker

react-datepicker๋Š” ๋ฆฌ์•กํŠธ์—์„œ ๋‹ฌ๋ ฅ์„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค!

npm ์‚ฌ์ดํŠธ์˜ ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ํšŸ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

react-datepicker ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ํšŸ์ˆ˜

npm

www.npmjs.com/package/react-datepicker

 

react-datepicker

A simple and reusable datepicker component for React

www.npmjs.com

๊ณต์‹ ๋ฌธ์„œ

reactdatepicker.com/

 

React Datepicker crafted by HackerOne

 

reactdatepicker.com

์„ค์น˜

์ผ๋‹จ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์„ค์น˜๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์„ ์‹คํ–‰ํ•˜๊ณ 

npm 

npm install react-datepicker --save

yarn

yarn add react-datepicker

์ž…๋ ฅํ•˜์…”์„œ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ root ํด๋” ๋‚ด์˜ package.json์„ ์—ด๊ณ 

"react-datepicker": "^3.8.0"

ํ•ด๋‹น ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

์‚ฌ์šฉํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž˜ ์ ์šฉ์ด ๋˜๋Š”์ง€ npm์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ๊ธฐ๋ณธ ์˜ˆ์ œ ๋‚ด์šฉ์„ ๋ณต์‚ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ ํ•ด์„œ ์ ์šฉ์‹œ์ผœ ๋ด…๋‹ˆ๋‹ค.

import React, { useState } from "react";
import DatePicker from "react-datepicker";

import "react-datepicker/dist/react-datepicker.css";

// CSS Modules, react-datepicker-cssmodules.css
// import 'react-datepicker/dist/react-datepicker-cssmodules.css';

const Example = () => {
  const [startDate, setStartDate] = useState(new Date());
  return (
    <DatePicker selected={startDate} onChange={date => setStartDate(date)} />
  );
};

์ ์šฉ ํ™”๋ฉด

๊ธฐ๋ณธ ์˜ˆ์ œ ์ ์šฉ ํ™”๋ฉด

์•„์ฃผ ๊น”๋”ํ•œ ์บ˜๋ฆฐ๋”์˜ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ์ž‘์—…์„ ํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”.

์ €๋Š” ํ”„๋กœ์ ํŠธ์˜ ์‹œ์ž‘ ๋‚ ์งœ์™€ ์ข…๋ฃŒ ๋‚ ์งœ ์ฆ‰, 2๊ฐœ์˜ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ๊ณต์‹๋ฌธ์„œ์˜ Date Range ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•ด์„œ ์ ์šฉ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

Date Range ์˜ˆ์ œ ์ฝ”๋“œ

์ €๋Š” ์ดˆ๊ธฐ ๋‚ ์งœ ๊ฐ’์„ ํ˜„์žฌ ๋‚ ์งœ ๊ฐ’์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด์„œ useState์˜ ์ดˆ๊ธฐ ๊ฐ’์„ new Date()๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” Type script, styled components ํ™˜๊ฒฝ์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ ์ ์šฉ ์ฝ”๋“œ

useState
react-datepicker ์ ์šฉ ์ฝ”๋“œ

์ ์šฉ ํ™”๋ฉด

์ ์šฉ ํ™”๋ฉด -1
์ ์šฉ ํ™”๋ฉด-2

 

์ด๋ ‡๊ฒŒ ์ž˜ ์ ์šฉ์ด ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€

์ €๋Š” ์—ฌ๊ธฐ์„œ ๋” ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์ด

  1. ๋‹ฌ๋ ฅ์ด ํ•œ๊ธ€๋กœ ํ‘œ์‹œ๋์œผ๋ฉด ํ•จ.
  2. Input์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์ด '๋…„ ์›” ์ผ'๋กœ ํ‘œ์‹œ๋์œผ๋ฉด ํ•จ.
  3. ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ ํ˜„์žฌ ๋‚ ์งœ๋ณด๋‹ค ์ง€๋‚œ ๋‚ ์งœ๋ฅผ ์„ ํƒ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ.
  4. Input ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ณ€๊ฒฝ์ ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

react-datepicker์€ ์ปค์Šคํ…€์ด ์ •๋ง ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณต์‹๋ฌธ์„œ์—๋„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค์ด ์ž˜ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ฌ๋ ฅ ํ•œ๊ธ€๋กœ ํ‘œ์‹œ

๋‹ฌ๋ ฅ์˜ ์š”์ผ์ด ํ˜„์žฌ ์˜์–ด๋กœ ํ‘œ์‹œ๋˜๊ณ  ์žˆ๋Š”๋ฐ ์ €๋Š” ํ•œ๊ตญ์–ด๋กœ ํ‘œ์‹œ๋์œผ๋ฉด ํ–ˆ์Šต๋‹ˆ๋‹ค.

Locale

๊ทธ๋ž˜์„œ ๊ณต์‹๋ฌธ์„œ์˜ Locale ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ฝ”๋“œ ์ƒ๋‹จ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์–ธ์–ด๋ฅผ import ํ•ด์ฃผ๊ณ ,

import { ko } from 'date-fns/esm/locale';

ํ•ด๋‹น props๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

locale={ko}

Custom date format

๊ธฐ๋ณธ ๋‚ ์งœ ํ˜•์‹์€ ' / ' ๋กœ ์ ์šฉ๋˜์–ด์žˆ๋Š”๋ฐ, ์ €๋Š” '๋…„ ์›” ์ผ' ํ˜•์‹์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์‹ ๋ฌธ์„œ์˜ Custom date format ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Custom date format

๊ทธ๋ž˜์„œ ์ €๋Š” dateFormat ๋ถ€๋ถ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด props๋กœ ์ ์šฉํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

dateFormat="yyyy๋…„ MM์›” dd์ผ"

ํ˜„์žฌ ๋‚ ์งœ์˜ ์ „ ๋‚ ์งœ ์„ ํƒ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์˜ ์‹œ์ž‘ ๋‚ ์งœ๋ฅผ ํ˜„์žฌ ๋‚ ์งœ๋ณด๋‹ค ์ „์˜ ๋‚ ์งœ๋กœ ์„ ํƒ์„ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œ ๋‚ ์งœ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์‹๋ฌธ์„œ์˜ Min Date ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Min date

๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ๊ธฐ๊ฐ„์˜ minDate ๋ถ€๋ถ„์— ํ˜„์žฌ ๋‚ ์งœ์˜ ๊ฐ’์„ ์ ์šฉ์‹œ์ผœ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

minDate={new Date()}

Input ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

ํ˜„์žฌ Input ์Šคํƒ€์ผ์ด ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉ์ด ์•ˆ๋˜์–ด์žˆ๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ๋ง์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ styled-components๋ฅผ ์‚ฌ์šฉ ์ค‘์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— styled-components๋กœ ์ปค์Šคํ…€์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

custom style

์ตœ์ข… ๊ฒฐ๊ณผ

์ตœ์ข… ๊ฒฐ๊ณผ -1
์ตœ์ข… ๊ฒฐ๊ณผ -2

 

์ œ๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ์บ˜๋ฆฐ๋”+ ์ปค์Šคํ…€๋“ค ๋ชจ๋‘ ์ ์šฉ์ด ์ž˜ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“• ๋งˆ๋ฌด๋ฆฌ

๋ฆฌ์•กํŠธ์—์„œ ์บ˜๋ฆฐ๋”๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ react-datepicker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๊ณต์‹๋ฌธ์„œ์— ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„ ์—†์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์ž˜ ๊ตฌํ˜„ํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ ์šฉํ•œ ๊ฒƒ ์™ธ์— ์—ฌ๋Ÿฌ ์˜ต์…˜๋“ค๋„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต์‹๋ฌธ์„œ์— ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด์žˆ๋Š”๋ฐ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„์„œ ์ž˜ ๊ฐ–๋‹ค ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!