DateRangePicker / RHFDateRangePicker
controlled usage와 React Hook Form 연동 기준으로 DateRangePicker와 RHFDateRangePicker의 주요 props와 사용 패턴을 정리한 가이드 페이지입니다.
DateRangePicker / controlled usage
DateRangePicker는 selected와 onSelectedChange를 외부 상태로 관리하는 controlled usage를 기준으로 정리한 기간 선택 컴포넌트입니다. 시작일과 종료일이 모두 선택되어야 최종 값이 반영됩니다.
Textfield props 확장
Omit<TextfieldProps, "children" | "isTextInputBlocked" | "onChange" | "type" | "value"> & { selected?: DateRange; onSelectedChange?: (selected?: DateRange) => void; dayPickerProps?: PropsRange | PropsRangeRequired; ... }- DateRangePicker는 Textfield props를 확장한 기간 선택 전용 컴포넌트입니다.
- placeholder, infoMessage, errorMessage, readOnly, disabled, isClearable, onClear 같은 Textfield props를 그대로 사용할 수 있습니다.
- selected와 onSelectedChange는 DateRange 형태로 동작하고, dayPickerProps는 기간 선택 모드에 맞는 옵션을 전달합니다.
- defaultIsCalendarOpen, getDefaultMonth, getShouldCloseOnSelect 같은 캘린더 제어 props도 함께 사용할 수 있습니다.
selected | onSelectedChange
DateRange | undefined기간 값은 { from, to } 형태로 제어합니다. 종료일까지 선택되면 최종 값이 반영되고, 새 범위를 다시 시작하면 기존 값은 비워지며 미완성 범위는 닫힐 때 초기화됩니다.
isClearable | onClear
boolean | () => voidclear 버튼은 isClearable이 true이고, 표시할 값이 있으며, onClear가 제공되고, dayPickerProps.required/readOnly/disabled가 아닐 때만 노출됩니다. 클릭하면 onSelectedChange(undefined)가 먼저 호출되고, 그 다음 onClear가 실행됩니다.
dayPickerProps
PropsRange | PropsRangeRequired기간 선택 모드에서 min, max, excludeDisabled, resetOnSelect, required, disabled 같은 옵션을 전달할 수 있습니다.
아래 예시는 최소/최대 기간과 주말 비활성화 처리, required 범위를 함께 보여줍니다.
displayFormat | formatDisplayValue
string | ({ displayFormat, locale, selected }) => string기간 선택 값도 입력창 표시 문자열을 원하는 형식으로 바꿀 수 있습니다.
defaultIsCalendarOpen | shouldCloseOnSelect | calendarButtonTitle | dropdownClassName
boolean | string기간 선택은 기본적으로 시작일과 종료일이 모두 선택되면 닫히고, 중간 선택 상태에서 닫으면 값이 초기화됩니다. defaultIsCalendarOpen은 내부 열림 상태의 초기값이고, shouldCloseOnSelect를 false로 두면 완료 후에도 캘린더를 유지할 수 있습니다. calendarButtonTitle과 dropdownClassName으로 캘린더 버튼/래퍼를 제어할 수 있습니다.
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
getDefaultMonth | getShouldCloseOnSelect
({ selected }) => Date | undefined | ({ shouldCloseOnSelect, nextSelected }) => booleangetDefaultMonth는 선택값이 없을 때 처음 보여줄 월을 계산하고, getShouldCloseOnSelect는 범위 선택 진행 중/완료 후 캘린더를 닫을지 직접 결정합니다.
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
disabled | readOnly
booleanDateRangePicker도 기본적으로 직접 타이핑 입력이 막혀 있고, disabled는 전체 상호작용을 비활성화합니다. readOnly는 현재 기간만 표시하면서 캘린더 열기, 기간 변경, clear 버튼을 막습니다.
RHFDateRangePicker / 폼 연동
RHFDateRangePicker는 DateRangePicker props를 유지하면서 useController로 DateRange 필드를 React Hook Form에 연결한 래퍼 컴포넌트입니다.
DateRangePicker props 확장 + RHFComponentProps
RHFComponentProps<TFormValues, TFieldName, DateRangePickerProps, "selected">RHFDateRangePicker는 DateRangePicker props를 기반으로 하고, "selected" 값은 RHF field.value로 관리합니다. name/control/rules/defaultValue/shouldUnregister/disabled는 RHF가 관리하고, 나머지 DateRangePicker UI props와 캘린더 제어 props는 그대로 전달할 수 있습니다. 새 범위를 다시 시작하면 RHF 값은 undefined로 초기화되고, clear 버튼을 사용하면 RHF 값이 먼저 undefined로 정리된 뒤 onClear가 호출됩니다.
rules
required | validate ...기간 필드는 시작일과 종료일이 모두 있어야 하므로 validate에서 from/to를 함께 검사하는 패턴이 자주 사용됩니다.
dayPickerProps
PropsRange | PropsRangeRequiredRHF 연결 상태에서도 min, max, excludeDisabled, disabled, required 같은 기간 선택 옵션을 그대로 전달할 수 있습니다.
displayFormat | formatDisplayValue | shouldCloseOnSelect
string | ({ displayFormat, locale, selected }) => string | booleanDateRangePicker에서 제공하는 표시 포맷과 닫힘 제어도 RHFDateRangePicker에서 그대로 사용할 수 있습니다.
disabled | readOnly
booleanRHFDateRangePicker도 DateRangePicker 상태 props를 그대로 상속합니다. disabled는 RHF controller와 UI를 함께 비활성화하고, readOnly는 현재 기간만 표시하면서 캘린더 열기, 기간 변경, clear를 막습니다.
defaultIsCalendarOpen | shouldCloseOnSelect | calendarButtonTitle | dropdownClassName
boolean | stringRHF 연결 상태에서도 캘린더 열림/닫힘 관련 props를 그대로 사용할 수 있습니다. defaultIsCalendarOpen은 내부 상태의 초기값이고, shouldCloseOnSelect=false로 완료 후에도 캘린더를 유지할 수 있습니다. calendarButtonTitle과 dropdownClassName도 동일하게 전달됩니다.
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
getDefaultMonth | getShouldCloseOnSelect
({ selected }) => Date | undefined | ({ shouldCloseOnSelect, nextSelected }) => booleanRHF 연결 상태에서도 getDefaultMonth와 getShouldCloseOnSelect를 그대로 사용할 수 있습니다. 선택값이 없을 때 처음 보여줄 월을 계산하거나, 범위 선택 완료 후 닫힘 조건을 직접 커스터마이징할 때 사용합니다.
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
DateRangePicker props 한눈에 보기
기간 선택 전용 동작과 Textfield 상속 규칙을 함께 정리했습니다.
| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
selected | DateRange | undefined | undefined | Optional | 확정된 기간 값입니다. 캘린더가 열려 있는 동안의 미완성 범위는 내부 draft로 유지되고, 외부에는 from/to가 모두 있을 때만 반영됩니다. |
onSelectedChange | (selected: DateRange | undefined) => void | undefined | Optional | 완성된 범위를 선택했을 때 최종 기간을 전달하고, 새 범위를 다시 시작하면 undefined로 초기화합니다. |
dayPickerProps | PropsRange | PropsRangeRequired | undefined | Optional | 기간 선택용 DayPicker 옵션을 전달합니다. min, max, excludeDisabled, required, disabled 같은 제약도 여기서 설정합니다. |
dayPickerProps.min | resetOnSelect | number | boolean | 1 | true | Optional | 명시하지 않으면 최소 1박 기준으로 동작하고, 새 범위를 시작할 때 기존 범위를 다시 선택하도록 resetOnSelect가 켜집니다. |
displayFormat | string | "yyyy.MM.dd" | Optional | 기본 formatDisplayValue가 input에 표시할 시작일/종료일 문자열 포맷입니다. |
formatDisplayValue | ({ displayFormat, locale, selected }) => string | formatRangeDateValue | Optional | 완성 전 범위는 `from -` 형태로, 완성 후에는 `from - to` 형태로 표시하는 기본 구현을 교체할 수 있습니다. |
getDefaultMonth | ({ selected }) => Date | undefined | selected.from ?? selected.to | Optional | 캘린더 기본 월을 범위의 시작일 또는 종료일 기준으로 계산합니다. |
shouldCloseOnSelect | getShouldCloseOnSelect | boolean | ({ shouldCloseOnSelect, nextSelected }) => boolean | auto close on complete range | Optional | 명시하지 않으면 from/to가 모두 선택된 시점에만 닫히고, boolean 또는 함수로 닫힘 전략을 바꿀 수 있습니다. |
defaultIsCalendarOpen | calendarButtonTitle | dropdownClassName | boolean | string | false | auto title | undefined | Optional | 초기 열림 상태와 우측 캘린더 버튼 title, dropdown wrapper 클래스명을 함께 제어합니다. |
placeholder | infoMessage | errorMessage | isClearable | onClear | Textfield inherited props | inherited | Optional | Textfield의 입력 표시, 메시지, clear UI 규칙을 그대로 상속합니다. required/readOnly/disabled에서는 clear 버튼이 숨겨집니다. |
DateRangePickerProps는 DatepickerBaseProps<DateRange, PropsRange | PropsRangeRequired>기반이고, 캘린더가 열린 동안의 미완성 범위는 내부 draft state로 보관한 뒤 완료된 범위만 외부 selected에 확정합니다.RHFDateRangePicker props 한눈에 보기
RHFDateRangePicker에서 사용하는 RHF 제어 props와 DateRangePicker 상속 props를 표로 정리했습니다.
| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
name | FieldPath<TFormValues> | - | Required | React Hook Form 필드 경로입니다. |
control | Control<TFormValues> | - | Required | useForm에서 받은 control 객체를 전달합니다. |
rules | UseControllerProps['rules'] | undefined | Optional | 필수 기간이나 from/to 완성 여부 같은 검증 규칙을 useController 규격으로 전달합니다. |
defaultValue | DateRange | undefined | undefined | Optional | 필요할 때만 사용하며, 일반적으로는 useForm의 defaultValues를 우선 사용합니다. |
shouldUnregister | boolean | false | Optional | 조건부 렌더링으로 필드가 사라질 때 RHF 상태에서도 값을 제거할지 결정합니다. |
disabled | boolean | false | Optional | useController와 실제 DateRangePicker에 동시에 반영되어 필드 업데이트와 상호작용을 막습니다. |
errorMessage | string | field error message | Optional | RHF 검증 메시지가 없을 때만 fallback 에러 메시지로 사용됩니다. |
onSelectedChange | (selected: DateRange | undefined) => void | undefined | Optional | field.onChange 이후 추가로 호출됩니다. 새 범위를 다시 시작하는 중간 단계에서는 undefined가 전달될 수 있습니다. |
dayPickerProps | displayFormat | shouldCloseOnSelect ... | DateRangePicker inherited props | inherited | Optional | RHF가 직접 관리하지 않는 기간 선택 UI props와 캘린더 제어 props는 그대로 전달할 수 있습니다. |
RHFDateRangePickerProps는 DateRangePickerProps에 RHF 제어 prop을 합친 구조입니다. 실제 selected 값은 RHF field state가 관리하고, 완료되지 않은 기간 선택 중간 상태는 내부 캘린더 draft로 유지됩니다.