(수근수근)

datepicker 자동 masking하기 본문

web/React

datepicker 자동 masking하기

InformationFarm 2023. 1. 5. 23:51

문제

- 현재 react-datepicker library를 활용하고 있는데 input에 날짜를 입력할 때 자동으로 MM-dd-yyyy형태로 작성되게 하고싶은데 mmddyyyy로 들어감

- locale에 따라 자동으로 formating형태에 따라 대쉬를 넣어주고 싶음

 

해결방법

- datepicker에서 열어둔 props의 customInput을 활용한다.

- 자동으로 masking을 도와주는 라이브러리(react-text-mask) 사용
(https://github.com/text-mask/text-mask/tree/master/react)

 

필요한 부분 코드만 작성 (나머지 불필요한 부분들은 삭제함)

- locale에 따라 다르게 mask부분의 배열을 변경해주면 됩니다.

 

import ReactDatePicker, { registerLocale } from 'react-datepicker';
import { ko, enUS } from 'date-fns/locale';
import MaskedInput from 'react-text-mask';

function DateInput({
  name,
  selected,
  locale = 'en',
  ...rest
}: props) {
  return (
    <Styled.Wrapper>
      <ReactDatePicker
        customInput={
          <MaskedInput
            mask={
              locale === 'ko'
                ? [/\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/]
                : [/\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/]
            }
            guide={false}
          />
        }
        dateFormat={DATE_FORMAT[locale]}
        {...rest}
      />
    </Styled.Wrapper>
  );
}

export default DateInput;

 

날짜 데이터 유효성

자동으로 -를 넣어주는 것 이상으로 월, 일, 윤년 같은 것을 자동으로 검증해주고 싶다면?

 

1.  text-mask-addons install

yarn add text-mask-addons

https://github.com/text-mask/text-mask/tree/master/addons/#readme

2. createAutoCorrectedDatePipe api를 통해서 autoCorrectedDatePipe반환 뒤 MaskedInput props로 전달
(저는 locale에 따라 다르게 유효범위를 주고있습니다.)

import MaskedInput from 'react-text-mask';
import createAutoCorrectedDatePipe from 'text-mask-addons/dist/createAutoCorrectedDatePipe';


function DateInput({
  name,
  selected,
  size = 'large',
  locale = 'en',
  onSelect,
  onChange,
  ...rest
}: Types.DateInputProps) {

  const autoCorrectedDatePipe = createAutoCorrectedDatePipe(
    locale === 'ko' ? 'yyyy-mm-dd' : 'mm-dd-yyyy',
  );


  return (
    <Styled.Wrapper size={size}>
      <ReactDatePicker
        locale={locale}
        name={name}
        selected={selected ? ""}
        customInput={
          <MaskedInput
            mask={
              locale === 'ko'
                ? [/\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/]
                : [/\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/]
            }
            guide={false}
            pipe={autoCorrectedDatePipe}
          />
        }

이후 찾아보니 mul Input의 유효한값 mask해주는 3rd party library로는 imask 라이브러리를 소개하고 있네요..

imask와 react-text-mask 장단점을 비교해보는 것이 필요해보입니다...  !

 

 

출처

https://stackoverflow.com/questions/56679242/insert-auto-slash-for-date-in-mm-dd-yyyy-format-for-react-datepicker
Comments