📍 Front-End/🜸 React.js

MUI DatePicker 사용하기 (v6)

예리Yelee 2023. 5. 24. 18:24
반응형

DatePicker를 사용하기 위해서 필요한 패키지를 설치해 준다.

날짜 라이브러리로 moment를 흔하게 사용하지만
MUI에서는 dayjs를 추천하고 있으며 momentjs에 비해 용량이 수십 배나 가볍다!
(moment로도 이용가능하긴 하다)

yarn add @mui/x-date-pickers

// Install date library (if not already installed)
yarn add dayjs

 


1.  기본 사용법

import * as React from 'react';
import { DemoContainer } from '@mui/x-date-pickers/internals/demo';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';

export default function BasicDatePicker() {
  return (
    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DemoContainer components={['DatePicker']}>
        <DatePicker label="Basic date picker" />
      </DemoContainer>
    </LocalizationProvider>
  );
}

위 코드는 캘린더에서 날짜를 찍을 수만 있고 사용자가 직접 입력할 순 없다

사용자가 직접 입력할 수 있게도 변경하려면 아래와 같이 코드를 수정해야 된다

import * as React from 'react';
import dayjs, { Dayjs } from 'dayjs';
import { DemoContainer } from '@mui/x-date-pickers/internals/demo';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';

export default function DatePickerValue() {
  const [value, setValue] = React.useState<Dayjs | null>(dayjs('2022-04-17'));

  return (
    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DemoContainer components={['DatePicker', 'DatePicker']}>
        <DatePicker
          label="Controlled picker"
          value={value}
          onChange={(newValue) => setValue(newValue)}
        />
      </DemoContainer>
    </LocalizationProvider>
  );
}

 

 

2.  커스텀하기

회사 디자인가이드에 맞게 커스텀하다 보니 MUI는 정말 없는 게 없구나 싶다 🥹

2-1) 현재 달력에서 이전/이후 달의 날짜 표시하기

디자인 가이드상 현재 달력에서 이전/이후 달의 날짜도 보이도록 수정해야 됐다
MUI 문서를 읽다 보니 showDaysOutsideCurrentMonth라는 옵션으로 설정가능했다

before / after

  <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DemoContainer components={['DatePicker', 'DatePicker']}>
        <DatePicker
          label="Controlled picker"
          showDaysOutsideCurrentMonth
          value={value}
          onChange={(newValue) => setValue(newValue)}
        />
      </DemoContainer>
    </LocalizationProvider>
  );

 

 

2-2) 입력칸의 날짜 format 변경하기

기본값으로 월/날짜/년도를 입력하도록 되어 있는데
dateformat prop을 이용해 포맷을 변경할 수 있다.

before / after

  <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DemoContainer components={['DatePicker', 'DatePicker']}>
        <DatePicker
          format="YYYY-MM-DD"
          showDaysOutsideCurrentMonth
          value={value}
          onChange={(newValue) => setValue(newValue)}
        />
      </DemoContainer>
    </LocalizationProvider>
  );

 

2-3 month calendar에서 영문이 아닌 숫자로 표시하기

기본적으로 DatePicker에서 월/년도를 클릭하면 달과 연도를 선택할 수 있는 캘린더가 뜨는데
달은 기본값으로 영문이 출력되고 있었다
모두가 알아보기 쉽게 숫자로 표기해 달라는 요구사항이 있었고 간단한 수정을 통해 변경할 수 있었다

LocalizationProvider에 dateFormats={{monthShort:'M`}} 을 추가하면 된다
monthShort 외에도 여러 가지 키가 있으니 문서 참고 바람

 

before / after

  <LocalizationProvider dateAdapter={AdapterDayjs} dateFormats={{ monthShort: `M` }}>
      <DemoContainer components={['DatePicker', 'DatePicker']}>
        <DatePicker
          label="Controlled picker"
          showDaysOutsideCurrentMonth
          value={value}
          onChange={(newValue) => setValue(newValue)}
        />
      </DemoContainer>
    </LocalizationProvider>
  );

 

2-4 특정 날짜 이전, 이후 선택 막기

아래 코드는 2023년 6월 1일 이후 날짜 선택을 막는 예제 코드이다.
dayjs에 isAfter를 사용해서 손쉽게 코드를 작성했고
반대로 이전 날짜 선택을 막고 싶은 경우 isBefore를 사용하면 된다

<DatePicker
	value={value}
    onChange={value => {
    	onChange(value);
    }}
    shouldDisableDate={day => {
  	  return dayjs(dayjs(day as Dayjs).format(`YYYY-MM-DD`)).isAfter(
 	      `2023-06-01`
 	   );
    }}
/>

 


DatePicker를 쓰다 보니 정말.. 정말 잘 만들었다는 생각이 들 정도로 숨겨진(?) 다양한 기능이 있었다
이렇게 잘 만들어 놓고 왜 설명을 거지같이 해놨는지..
API 문서에 좀 더 상세하게 설명이 적혀있으면 좋겠다

 

 

DatePicker API - MUI X

API reference docs for the React DatePicker component. Learn about the props, CSS, and other APIs of this exported module.

mui.com

 

반응형