Next UI Components Guide
Project Information

DateRangePicker / RHFDateRangePicker

controlled usage와 React Hook Form 연동 기준으로 DateRangePicker와 RHFDateRangePicker의 주요 props와 사용 패턴을 정리한 가이드 페이지입니다.

DateRangePicker

DateRangePicker / controlled usage

DateRangePicker는 selected와 onSelectedChange를 외부 상태로 관리하는 controlled usage를 기준으로 정리한 기간 선택 컴포넌트입니다. 시작일과 종료일이 모두 선택되어야 최종 값이 반영됩니다.

Prop

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도 함께 사용할 수 있습니다.

입실/퇴실, 시작일/종료일처럼 범위를 선택할 때 사용합니다.
Prop

selected | onSelectedChange

DateRange | undefined

기간 값은 { from, to } 형태로 제어합니다. 종료일까지 선택되면 최종 값이 반영되고, 새 범위를 다시 시작하면 기존 값은 비워지며 미완성 범위는 닫힐 때 초기화됩니다.

선택 범위: 2026.03.18 - 2026.03.22
Prop

isClearable | onClear

boolean | () => void

clear 버튼은 isClearable이 true이고, 표시할 값이 있으며, onClear가 제공되고, dayPickerProps.required/readOnly/disabled가 아닐 때만 노출됩니다. 클릭하면 onSelectedChange(undefined)가 먼저 호출되고, 그 다음 onClear가 실행됩니다.

초기 범위 유지 / clear 버튼으로 범위를 비울 수 있습니다.
Prop

dayPickerProps

PropsRange | PropsRangeRequired

기간 선택 모드에서 min, max, excludeDisabled, resetOnSelect, required, disabled 같은 옵션을 전달할 수 있습니다.
아래 예시는 최소/최대 기간과 주말 비활성화 처리, required 범위를 함께 보여줍니다.

2일 이상 5일 이하, 주말 제외 범위 선택 예시입니다.
required 범위는 clear 버튼이 숨겨지고, resetOnSelect로 새 범위를 다시 시작할 수 있습니다.
Prop

displayFormat | formatDisplayValue

string | ({ displayFormat, locale, selected }) => string

기간 선택 값도 입력창 표시 문자열을 원하는 형식으로 바꿀 수 있습니다.

Prop

defaultIsCalendarOpen | shouldCloseOnSelect | calendarButtonTitle | dropdownClassName

boolean | string

기간 선택은 기본적으로 시작일과 종료일이 모두 선택되면 닫히고, 중간 선택 상태에서 닫으면 값이 초기화됩니다. defaultIsCalendarOpen은 내부 열림 상태의 초기값이고, shouldCloseOnSelect를 false로 두면 완료 후에도 캘린더를 유지할 수 있습니다. calendarButtonTitle과 dropdownClassName으로 캘린더 버튼/래퍼를 제어할 수 있습니다.

defaultIsCalendarOpen, calendarButtonTitle, dropdownClassName을 함께 사용한 예시입니다.
shouldCloseOnSelect=false로 완료 후에도 캘린더를 유지하는 예시입니다.
Prop

getDefaultMonth | getShouldCloseOnSelect

({ selected }) => Date | undefined | ({ shouldCloseOnSelect, nextSelected }) => boolean

getDefaultMonth는 선택값이 없을 때 처음 보여줄 월을 계산하고, getShouldCloseOnSelect는 범위 선택 진행 중/완료 후 캘린더를 닫을지 직접 결정합니다.

selected가 없으면 2026년 7월부터 시작하도록 기본 월을 커스터마이징한 예시입니다.
종료일이 20일 미만이면 완료 범위를 선택해도 캘린더를 유지하고, 20일 이후면 닫히도록 제어한 예시입니다.
Prop

disabled | readOnly

boolean
default: false

DateRangePicker도 기본적으로 직접 타이핑 입력이 막혀 있고, disabled는 전체 상호작용을 비활성화합니다. readOnly는 현재 기간만 표시하면서 캘린더 열기, 기간 변경, clear 버튼을 막습니다.

readOnly 상태에서는 현재 기간만 표시되고 캘린더 선택과 clear가 막힙니다.

React Hook Form

RHFDateRangePicker / 폼 연동

RHFDateRangePicker는 DateRangePicker props를 유지하면서 useController로 DateRange 필드를 React Hook Form에 연결한 래퍼 컴포넌트입니다.

Prop

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가 호출됩니다.

name과 control만으로 RHF 기간 필드와 연결됩니다.
Prop

rules

required | validate ...

기간 필드는 시작일과 종료일이 모두 있어야 하므로 validate에서 from/to를 함께 검사하는 패턴이 자주 사용됩니다.

Prop

dayPickerProps

PropsRange | PropsRangeRequired

RHF 연결 상태에서도 min, max, excludeDisabled, disabled, required 같은 기간 선택 옵션을 그대로 전달할 수 있습니다.

주말 제외, 최소 2일 이상 최대 4일 이하 범위 예시입니다.
Prop

displayFormat | formatDisplayValue | shouldCloseOnSelect

string | ({ displayFormat, locale, selected }) => string | boolean

DateRangePicker에서 제공하는 표시 포맷과 닫힘 제어도 RHFDateRangePicker에서 그대로 사용할 수 있습니다.

기간 표시 문자열을 커스터마이징한 RHF 예시입니다.
Prop

disabled | readOnly

boolean

RHFDateRangePicker도 DateRangePicker 상태 props를 그대로 상속합니다. disabled는 RHF controller와 UI를 함께 비활성화하고, readOnly는 현재 기간만 표시하면서 캘린더 열기, 기간 변경, clear를 막습니다.

disabled는 RHF field와 UI를 함께 비활성화합니다.
readOnly 상태에서는 현재 기간만 표시되고 캘린더와 clear 버튼이 비활성화됩니다.
Prop

defaultIsCalendarOpen | shouldCloseOnSelect | calendarButtonTitle | dropdownClassName

boolean | string

RHF 연결 상태에서도 캘린더 열림/닫힘 관련 props를 그대로 사용할 수 있습니다. defaultIsCalendarOpen은 내부 상태의 초기값이고, shouldCloseOnSelect=false로 완료 후에도 캘린더를 유지할 수 있습니다. calendarButtonTitle과 dropdownClassName도 동일하게 전달됩니다.

defaultIsCalendarOpen, calendarButtonTitle, dropdownClassName을 함께 사용한 RHF 예시입니다.
shouldCloseOnSelect=false로 완료 후에도 캘린더를 유지하는 RHF 예시입니다.
Prop

getDefaultMonth | getShouldCloseOnSelect

({ selected }) => Date | undefined | ({ shouldCloseOnSelect, nextSelected }) => boolean

RHF 연결 상태에서도 getDefaultMonth와 getShouldCloseOnSelect를 그대로 사용할 수 있습니다. 선택값이 없을 때 처음 보여줄 월을 계산하거나, 범위 선택 완료 후 닫힘 조건을 직접 커스터마이징할 때 사용합니다.

selected가 없으면 2026년 7월부터 시작하도록 기본 월을 커스터마이징한 RHF 예시입니다.
종료일이 20일 미만이면 완료 범위를 선택해도 캘린더를 유지하고, 20일 이후면 닫히도록 제어한 RHF 예시입니다.

Props Table

DateRangePicker props 한눈에 보기

기간 선택 전용 동작과 Textfield 상속 규칙을 함께 정리했습니다.

PropTypeDefaultRequiredDescription
selectedDateRange | undefinedundefinedOptional확정된 기간 값입니다. 캘린더가 열려 있는 동안의 미완성 범위는 내부 draft로 유지되고, 외부에는 from/to가 모두 있을 때만 반영됩니다.
onSelectedChange(selected: DateRange | undefined) => voidundefinedOptional완성된 범위를 선택했을 때 최종 기간을 전달하고, 새 범위를 다시 시작하면 undefined로 초기화합니다.
dayPickerPropsPropsRange | PropsRangeRequiredundefinedOptional기간 선택용 DayPicker 옵션을 전달합니다. min, max, excludeDisabled, required, disabled 같은 제약도 여기서 설정합니다.
dayPickerProps.min | resetOnSelectnumber | boolean1 | trueOptional명시하지 않으면 최소 1박 기준으로 동작하고, 새 범위를 시작할 때 기존 범위를 다시 선택하도록 resetOnSelect가 켜집니다.
displayFormatstring"yyyy.MM.dd"Optional기본 formatDisplayValue가 input에 표시할 시작일/종료일 문자열 포맷입니다.
formatDisplayValue({ displayFormat, locale, selected }) => stringformatRangeDateValueOptional완성 전 범위는 `from -` 형태로, 완성 후에는 `from - to` 형태로 표시하는 기본 구현을 교체할 수 있습니다.
getDefaultMonth({ selected }) => Date | undefinedselected.from ?? selected.toOptional캘린더 기본 월을 범위의 시작일 또는 종료일 기준으로 계산합니다.
shouldCloseOnSelect | getShouldCloseOnSelectboolean | ({ shouldCloseOnSelect, nextSelected }) => booleanauto close on complete rangeOptional명시하지 않으면 from/to가 모두 선택된 시점에만 닫히고, boolean 또는 함수로 닫힘 전략을 바꿀 수 있습니다.
defaultIsCalendarOpen | calendarButtonTitle | dropdownClassNameboolean | stringfalse | auto title | undefinedOptional초기 열림 상태와 우측 캘린더 버튼 title, dropdown wrapper 클래스명을 함께 제어합니다.
placeholder | infoMessage | errorMessage | isClearable | onClearTextfield inherited propsinheritedOptionalTextfield의 입력 표시, 메시지, clear UI 규칙을 그대로 상속합니다. required/readOnly/disabled에서는 clear 버튼이 숨겨집니다.
DateRangePickerProps DatepickerBaseProps<DateRange, PropsRange | PropsRangeRequired>기반이고, 캘린더가 열린 동안의 미완성 범위는 내부 draft state로 보관한 뒤 완료된 범위만 외부 selected에 확정합니다.

Props Table

RHFDateRangePicker props 한눈에 보기

RHFDateRangePicker에서 사용하는 RHF 제어 props와 DateRangePicker 상속 props를 표로 정리했습니다.

PropTypeDefaultRequiredDescription
nameFieldPath<TFormValues>-RequiredReact Hook Form 필드 경로입니다.
controlControl<TFormValues>-RequireduseForm에서 받은 control 객체를 전달합니다.
rulesUseControllerProps['rules']undefinedOptional필수 기간이나 from/to 완성 여부 같은 검증 규칙을 useController 규격으로 전달합니다.
defaultValueDateRange | undefinedundefinedOptional필요할 때만 사용하며, 일반적으로는 useForm의 defaultValues를 우선 사용합니다.
shouldUnregisterbooleanfalseOptional조건부 렌더링으로 필드가 사라질 때 RHF 상태에서도 값을 제거할지 결정합니다.
disabledbooleanfalseOptionaluseController와 실제 DateRangePicker에 동시에 반영되어 필드 업데이트와 상호작용을 막습니다.
errorMessagestringfield error messageOptionalRHF 검증 메시지가 없을 때만 fallback 에러 메시지로 사용됩니다.
onSelectedChange(selected: DateRange | undefined) => voidundefinedOptionalfield.onChange 이후 추가로 호출됩니다. 새 범위를 다시 시작하는 중간 단계에서는 undefined가 전달될 수 있습니다.
dayPickerProps | displayFormat | shouldCloseOnSelect ...DateRangePicker inherited propsinheritedOptionalRHF가 직접 관리하지 않는 기간 선택 UI props와 캘린더 제어 props는 그대로 전달할 수 있습니다.
RHFDateRangePickerProps DateRangePickerProps에 RHF 제어 prop을 합친 구조입니다. 실제 selected 값은 RHF field state가 관리하고, 완료되지 않은 기간 선택 중간 상태는 내부 캘린더 draft로 유지됩니다.