커스텀 날짜 라이브러리 사용하기
커스텀 날짜 라이브러리 사용하기 (Use custom date library)
기본적으로 Ant Design은 시간과 날짜를 처리할 때 Day.js를 사용해요. Day.js는 Moment.js와 같은 API를 제공하는 불변(immutable) 날짜-시간 라이브러리예요.
출처: 문서
본문
기본적으로 Ant Design은 시간과 날짜를 처리할 때 Day.js를 사용해요. Day.js는 Moment.js와 같은 API를 제공하는, Moment.js의 대안인 불변(immutable) 날짜-시간 라이브러리예요.
다른 날짜 라이브러리를 사용하고 싶을 수도 있어요 (Ant Design은 현재 moment, date-fns, luxon을 지원해요). 커스터마이징 방법은 두 가지를 제공해요:
커스텀 컴포넌트
첫 번째 방법은 generatePicker(또는 generateCalendar)로 Picker 컴포넌트를 만드는 거예요.
먼저 antd 데모를 초기화해요. 스캐폴딩 가이드를 참고하거나, 여기서 바로 antd 초기화를 시작할 수 있어요.
DatePicker.tsx
src/components/DatePicker.tsx를 만듭니다.
예를 들어:
import momentGenerateConfig from '@rc-component/picker/generate/moment';
import { DatePicker } from 'antd';
import type { Moment } from 'moment';
const MyDatePicker = DatePicker.generatePicker<Moment>(momentGenerateConfig);
export default MyDatePicker;
TimePicker.tsx
src/components/TimePicker.tsx를 만듭니다.
예를 들어:
import * as React from 'react';
import type { PickerTimeProps } from 'antd/es/date-picker/generatePicker';
import type { Moment } from 'moment';
import DatePicker from './DatePicker';
export interface TimePickerProps extends Omit<PickerTimeProps<Moment>, 'picker'> {}
const TimePicker = React.forwardRef<any, TimePickerProps>((props, ref) => (
<DatePicker {...props} picker="time" mode={undefined} ref={ref} />
));
TimePicker.displayName = 'TimePicker';
export default TimePicker;
Calendar.tsx
src/components/Calendar.tsx를 만듭니다.
예를 들어:
import momentGenerateConfig from '@rc-component/picker/generate/moment';
import { Calendar } from 'antd';
import type { Moment } from 'moment';
const MyCalendar = Calendar.generateCalendar<Moment>(momentGenerateConfig);
export default MyCalendar;
커스텀 컴포넌트 내보내기
src/components/index.tsx를 만듭니다.
예를 들어:
export { default as Calendar } from './Calendar';
export { default as DatePicker } from './DatePicker';
export { default as TimePicker } from './TimePicker';
커스텀 컴포넌트 사용하기
src/App.tsx를 수정해서 moment와 커스텀 컴포넌트를 임포트해요.
- import { DatePicker, Calendar } from 'antd';
- import format from 'dayjs';
+ import { DatePicker, TimePicker, Calendar } from './components';
+ import format from 'moment';
antd-moment-webpack-plugin
우리는 또 다른 구현도 제공해요. @ant-design/moment-webpack-plugin을 사용하면 기존 코드를 한 줄도 바꾸지 않고 Day.js를 moment로 바로 교체할 수 있어요. 더 자세한 내용은 @ant-design/moment-webpack-plugin에서 확인할 수 있어요.
// webpack-config.js
const AntdMomentWebpackPlugin = require('@ant-design/moment-webpack-plugin');
module.exports = {
// ...
plugins: [new AntdMomentWebpackPlugin()],
};
date-fns 사용하기
date-fns는 현재 dayjs와 비슷한 커스텀 컴포넌트 방식을 지원해요. 차이점은 사용하는 매개변수 타입이 다르다는 점이에요. antd 4.5.0 이상에서 지원됩니다.
예를 들어:
DatePicker.tsx
src/components/DatePicker.tsx를 만듭니다.
코드는 다음과 같아요:
import dateFnsGenerateConfig from '@rc-component/picker/generate/dateFns';
import { DatePicker } from 'antd';
const MyDatePicker = DatePicker.generatePicker<Date>(dateFnsGenerateConfig);
export default MyDatePicker;
luxon 사용하기
antd 5.4.0부터 luxon을 dayjs 대신 사용할 수 있고 같은 기능을 지원해요. 다만 동작에 몇 가지 차이가 생기는데, 아래에서 설명할게요.
구현
src/components/DatePicker.tsx 파일을 만들고 luxon 기반 picker를 다음과 같이 구현해요:
import luxonGenerateConfig from '@rc-component/picker/generate/luxon';
import { DatePicker } from 'antd';
import type { DateTime } from 'luxon';
const MyDatePicker = DatePicker.generatePicker<DateTime>(luxonGenerateConfig);
export default MyDatePicker;
dayjs와의 주요 차이점
luxon 사용자라면 luxon에 로컬라이제이션(localization)용 커스텀 구현이 함께 제공되지 않는다는 걸 알고 있을 거예요. 대신 브라우저 네이티브 Intl API에 의존해요.
이 때문에 다른 날짜 라이브러리와 서식이 다소 달라져요. 현재 주요 차이는 다음과 같아요:
- 한 주의 첫 번째 요일이 로케일과 무관하게 항상 월요일이에요.
- 연도의 주(week of year) 번호가 때때로 달라요 (determining할 때 ISO 주 규칙을 사용해요).
- 커스텀 로케일에서 짧은 요일 형식이 때때로 달라요 (2자 대신 3자가 될 수 있어요).
- 선택한 주 레이블 형식이 약간 달라요 (예:
"2021-1st"대신"2021-01").
luxon 구성을 조정하면 이런 기본 luxon 동작을 커스터마이징할 수 있어요:
import luxonGenerateConfig from '@rc-component/picker/generate/luxon';
import { DatePicker } from 'antd';
import type { DateTime } from 'luxon';
const customLuxonConfig = {
...luxonGenerateConfig,
getWeekFirstDay(locale) {
// Your custom implementation goes here
},
};
const MyDatePicker = DatePicker.generatePicker<DateTime>(customLuxonConfig);
export default MyDatePicker;
이런 커스터마이징을 하면 결과 DatePicker의 동작이 예상치 못한 방식으로 바뀔 수 있으니, 엣지 케이스를 반드시 테스트해 보세요.