useDatePicker

O hook principal para seleção de data única. Gerencia o estado do calendário, comportamento de abrir/fechar, navegação por teclado e formatação de data.

Importar

import { useDatePicker } from "react-date-range-picker-headless";

Uso

import { useState } from "react";
import { useDatePicker } from "react-date-range-picker-headless";
function MyDatePicker() {
const [date, setDate] = useState<Date | null>(null);
const picker = useDatePicker({
value: date,
onChange: setDate,
});
return (
<div ref={picker.containerRef}>
<button onClick={picker.handleToggle}>
{picker.displayValue || picker.locale.placeholder}
</button>
{picker.isOpen && (
<div ref={picker.popupRef} onKeyDown={picker.handleKeyDown}>
{/* Cabeçalho do calendário */}
<button onClick={picker.handlePrevMonth}>{picker.locale.prevMonth}</button>
<span>{picker.locale.formatMonthYear(picker.calendar.month)}</span>
<button onClick={picker.handleNextMonth}>{picker.locale.nextMonth}</button>
{/* Grade do calendário */}
{picker.calendar.weeks.flat().map((day, i) => {
if (!day) return <span key={i} />;
const dp = picker.getDayProps(day);
return (
<button key={i} onClick={() => picker.handleDateClick(day)} disabled={dp.isDisabled}>
{dp.day}
</button>
);
})}
{/* Rodapé */}
<button onClick={picker.handleConfirm}>{picker.locale.confirm}</button>
</div>
)}
</div>
);
}

Opções

OpçãoTipoPadrãoDescrição
valueDate | nullObrigatório. A data atualmente selecionada.
onChange(date: Date | null) => voidObrigatório. Chamado quando a seleção de data muda.
minDateDateData selecionável mais antiga.
maxDateDateData selecionável mais recente.
localePartial<Locale>DEFAULT_LOCALESobrescreve as strings de localidade.
initialMonthDateMês a ser exibido inicialmente (padrão é o valor ou hoje).
sizeDatePickerSizePassagem de UI para componentes estilizados. Hooks headless ignoram isso.
weekStartsOnWeekDay"sunday"Primeiro dia da semana.
isDateUnavailable(date: Date) => booleanFunção personalizada para desabilitar datas específicas.
displayFormatstringString de formato personalizado para o valor de exibição (ex: "YYYY/MM/DD").
openbooleanEstado de abertura controlado. Quando fornecido, o hook não gerencia o estado de abertura internamente.
initialOpenbooleanfalseEstado de abertura inicial (modo não controlado).
onOpenChange(open: boolean) => voidCallback quando o estado de abertura muda. Funciona com os modos controlado e não controlado.
requiredbooleanfalseQuando verdadeiro, handleClear não faz nada.
todayDatenew Date()Sobrescreve a data de hoje para os cálculos de isToday e disablePast/disableFuture.
onMonthChange(month: Date) => voidCallback quando o mês exibido muda.
disablePastbooleanfalseDesabilita todas as datas anteriores a hoje.
disableFuturebooleanfalseDesabilita todas as datas posteriores a hoje.
showOutsideDaysbooleanfalseMostra dias dos meses adjacentes para preencher a grade de 6 semanas.
highlightDatesDate[]Array de datas para destacar no calendário.
shouldCloseOnSelectbooleanfalseConfirma automaticamente e fecha ao clicar na data.
numberOfMonthsnumber1Número de meses a serem exibidos simultaneamente.
captionLayoutCaptionLayout"buttons""buttons" para setas anterior/próximo, "dropdown" para seletores de ano/mês.
fromYearnumbercurrent year - 100Ano de início para o modo de dropdown.
toYearnumbercurrent year + 10Ano de término para o modo de dropdown.

Valores de Retorno

NomeTipoDescrição
isOpenbooleanSe o pop-up está aberto.
tempDateDate | nullData selecionada temporariamente (antes da confirmação).
currentMonthDateO mês atualmente exibido.
localeLocaleObjeto de localidade resolvido com todas as strings.
calendarCalendarMonthDados do calendário para o mês atual (inclui month, days, weeks).
calendarsCalendarMonth[]Array de meses do calendário (comprimento = numberOfMonths).
getDayProps(date: Date, referenceMonth?: Date) => DayPropsCalcula as flags para a célula de um dia do calendário.
displayValuestringString formatada do valor confirmado.
hasValuebooleanSe uma data está atualmente confirmada.
canConfirmbooleanSe a seleção atual é válida para confirmação.
handleDateClick(date: Date) => voidLida com o clique na célula de um dia.
handlePrevMonth() => voidNavega para o mês anterior.
handleNextMonth() => voidNavega para o mês seguinte.
handleOpen() => voidAbre o pop-up.
handleClose() => voidFecha o pop-up (descarta alterações não confirmadas).
handleToggle() => voidAlterna o pop-up.
handleConfirm() => voidConfirma a seleção e fecha.
handleCancel() => voidCancela e reverte para o valor anterior.
handleClear() => voidLimpa o valor (não faz nada se required).
handleGoToToday() => voidNavega o calendário para o mês de hoje.
containerRefRefObject<HTMLDivElement | null>Anexe ao elemento wrapper para detecção de clique fora.
popupRefRefObject<HTMLDivElement | null>Anexe ao elemento do pop-up.
focusedDateDate | nullData atualmente focada pelo teclado.
handleKeyDown(e: KeyboardEvent<HTMLElement>) => voidManipulador de eventos de teclado para as teclas de seta, Enter, Escape, Tab.
yearsnumber[]Array de anos para o modo de legenda com dropdown.
monthsnumber[]Array de índices de meses (0-11) para o modo de legenda com dropdown.
handleYearSelect(year: number, calendarIndex?: number) => voidDefine o ano exibido (modo de dropdown).
handleMonthSelect(month: number, calendarIndex?: number) => voidDefine o mês exibido (modo de dropdown).

Comportamentos Principais

Estado de Abertura Controlado vs Não Controlado

Por padrão, o hook gerencia o abrir/fechar internamente. Para controlá-lo externamente, passe open e onOpenChange:

const [isOpen, setIsOpen] = useState(false);
const picker = useDatePicker({
value: date,
onChange: setDate,
open: isOpen,
onOpenChange: setIsOpen,
});

shouldCloseOnSelect

Quando shouldCloseOnSelect é true, clicar em uma data confirma imediatamente e fecha o pop-up, pulando a etapa de confirmação explícita.

TeclaAção
Arrow Up/Down/Left/RightMove o foco entre os dias
Enter / SpaceSeleciona a data focada
EscapeCancela e fecha
TabMove o foco dentro do pop-up

Legenda com Dropdown

Quando captionLayout é "dropdown", o cabeçalho mostra seletores de ano e mês em vez de botões de anterior/próximo. Use years, months, handleYearSelect e handleMonthSelect para renderizar os dropdowns.