useDateRangePicker

Çift aylık takvim, fareyle üzerine gelince önizleme ve önceden ayarlanmış aralıklar ile tarih aralığı seçimi için hook.

İçe Aktarma

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

Kullanım

import { useState } from "react";
import { useDateRangePicker } from "react-date-range-picker-headless";
function MyDateRangePicker() {
const [range, setRange] = useState<{ start: Date | null; end: Date | null }>({
start: null,
end: null,
});
const picker = useDateRangePicker({
value: range,
onChange: setRange,
presets: [
{
label: "Son 7 gün",
value: () => {
const end = new Date();
const start = new Date();
start.setDate(start.getDate() - 6);
return { start, end };
},
},
],
});
return (
<div ref={picker.containerRef}>
<button onClick={picker.handleToggle}>
{picker.displayValue || picker.locale.rangePlaceholder}
</button>
{picker.isOpen && (
<div ref={picker.popupRef} onKeyDown={picker.handleKeyDown}>
{/* Yan yana iki takvim */}
{[picker.leftCalendar, picker.rightCalendar].map((cal, calIdx) => (
<div key={calIdx}>
<span>{picker.locale.formatMonthYear(cal.month)}</span>
{cal.weeks.flat().map((day, i) => {
if (!day) return <span key={i} />;
const dp = picker.getDayProps(day, cal.month);
return (
<button
key={i}
onClick={() => picker.handleDateClick(day)}
onMouseEnter={() => picker.handleDateHover(day)}
onMouseLeave={() => picker.handleDateHover(null)}
>
{dp.day}
</button>
);
})}
</div>
))}
{/* Hazır Ayarlar */}
{picker.presets.map((preset, i) => (
<button
key={i}
onClick={() => picker.handlePresetClick(preset)}
style={{ fontWeight: i === picker.activePresetIndex ? "bold" : "normal" }}
>
{preset.label}
</button>
))}
<button onClick={picker.handleConfirm}>{picker.locale.confirm}</button>
</div>
)}
</div>
);
}

Seçenekler

SeçenekTürVarsayılanAçıklama
value{ start: Date | null; end: Date | null }Gerekli. Mevcut aralık değeri.
onChange(value: { start: Date | null; end: Date | null }) => voidGerekli. Aralık değiştiğinde çağrılır.
maxDaysnumberBir aralıkta izin verilen maksimum gün sayısı (dahil).
minDaysnumberBir aralıkta gerekli olan minimum gün sayısı (dahil).
presetsDateRangePreset[]Önceden tanımlanmış tarih aralığı hazır ayarları (ör. “Son 7 gün”, “Bu ay”).
allowSingleDateInRangebooleantruefalse olduğunda, başlangıcın bitişe eşit olduğu bir aralığın seçilmesini engeller.
minDateDateSeçilebilecek en erken tarih.
maxDateDateSeçilebilecek en son tarih.
localePartial<Locale>DEFAULT_LOCALEYerelleştirme metinlerini geçersiz kılın.
initialMonthDateGörüntülenecek başlangıç ayı.
sizeDatePickerSizeUI geçişi.
weekStartsOnWeekDay"sunday"Haftanın ilk günü.
isDateUnavailable(date: Date) => booleanBelirli tarihleri devre dışı bırakmak için özel fonksiyon.
displayFormatstringGörüntülenen değer için özel format metni.
openbooleanKontrollü açık durumu.
initialOpenbooleanfalseBaşlangıçtaki açık durumu (kontrolsüz).
onOpenChange(open: boolean) => voidAçık durumu değiştiğinde geri arama.
requiredbooleanfalseTrue olduğunda, handleClear işlem yapmaz.
todayDatenew Date()Bugünün tarihini geçersiz kılın.
onMonthChange(month: Date) => voidGörüntülenen ay değiştiğinde geri arama.
disablePastbooleanfalseBugünden önceki tüm tarihleri devre dışı bırakın.
disableFuturebooleanfalseBugünden sonraki tüm tarihleri devre dışı bırakın.
showOutsideDaysbooleanfalseBitişik ayın günlerini göster.
highlightDatesDate[]Vurgulanacak tarihler dizisi.
shouldCloseOnSelectbooleanfalseBitiş tarihi seçildiğinde otomatik onayla.
numberOfMonthsnumber2Görüntülenecek takvim ayı sayısı.
captionLayoutCaptionLayout"buttons"Başlık düzeni modu.
fromYearnumbergeçerli yıl - 100Açılır menü için başlangıç yılı.
toYearnumbergeçerli yıl + 10Açılır menü için bitiş yılı.

Dönüş Değerleri

İsimTürAçıklama
isOpenbooleanAçılır pencerenin açık olup olmadığı.
tempStartDateDate | nullGeçici başlangıç tarihi (onaydan önce).
tempEndDateDate | nullGeçici bitiş tarihi (onaydan önce).
hoveredDateDate | nullO anda üzerine gelinen tarih (aralık önizlemesi için).
leftMonthDateSol takvimin görüntülenen ayı.
rightMonthDateSağ takvimin görüntülenen ayı.
localeLocaleÇözümlenmiş yerelleştirme nesnesi.
leftCalendarCalendarMonthSol panel için takvim verileri.
rightCalendarCalendarMonthSağ panel için takvim verileri.
calendarsCalendarMonth[]Tüm takvim aylarının dizisi.
getDayProps(date: Date, referenceMonth?: Date) => DayPropsBir takvim günü hücresi için bayrakları hesaplayın. Çok aylı düzenlerde ay dışı gün algılamasının doğru çalışması için referenceMonth değerini geçin.
displayValuestringOnaylanmış aralığın biçimlendirilmiş metni.
hasValuebooleanBir aralığın o anda onaylanıp onaylanmadığı.
canConfirmbooleanMevcut seçimin onay için geçerli olup olmadığı.
handleDateClick(date: Date) => voidBir gün hücresi tıklamasını işleyin. İlk tıklama başlangıcı, ikinci tıklama bitişi ayarlar.
handleDateHover(date: Date | null) => voidAralık önizlemesi için fareyle üzerine gelme olayını işleyin.
handlePrevMonth() => voidHer iki takvimi de bir ay geri götürün.
handleNextMonth() => voidHer iki takvimi de bir ay ileri götürün.
handleOpen() => voidAçılır pencereyi açın.
handleClose() => voidAçılır pencereyi kapatın.
handleToggle() => voidAçılır pencereyi aç/kapat.
handleConfirm() => voidSeçimi onaylayın ve kapatın.
handleCancel() => voidİptal edin ve önceki değere geri dönün.
handleClear() => voidAralığı temizleyin (required ise işlem yapmaz).
handleGoToToday() => voidBugünün ayına gidin.
containerRefRefObject<HTMLDivElement | null>Dışarıya tıklama algılaması için sarmalayıcıya ekleyin.
popupRefRefObject<HTMLDivElement | null>Açılır pencere öğesine ekleyin.
focusedDateDate | nullKlavye ile odaklanılan tarih.
handleKeyDown(e: KeyboardEvent<HTMLElement>) => voidKlavye ile gezinme işleyicisi.
presetsDateRangePreset[]Hazır ayarlar dizisi (render için geçiş).
handlePresetClick(preset: DateRangePreset) => voidBir hazır ayar aralığını uygulayın.
activePresetIndexnumberO anda eşleşen hazır ayarın dizini (yoksa -1).
yearsnumber[]Açılır menü modu için yıllar dizisi.
monthsnumber[]Açılır menü modu için ay dizinleri.
handleYearSelect(year: number, calendarIndex?: number) => voidGörüntülenen yılı ayarlayın.
handleMonthSelect(month: number, calendarIndex?: number) => voidGörüntülenen ayı ayarlayın.

Temel Davranışlar

Aralık Seçim Akışı

  1. İlk tıklama başlangıç tarihini ayarlar (bitiş tarihi temizlenir)
  2. İkinci tıklama bitiş tarihini ayarlar (başlangıçtan önceyse otomatik olarak yer değiştirir)
  3. Üçüncü tıklama sıfırlar ve yeni bir aralık başlatır

Üzerine Gelince Önizleme

Kullanıcı bir başlangıç tarihi seçtiğinde ancak henüz bir bitiş tarihi seçmediğinde, handleDateHover hoveredDate değerini günceller. getDayProps fonksiyonu bunu isInHoverRange ve isHoverTarget değerlerini hesaplamak için kullanır ve potansiyel aralığın bir önizlemesini göstermenize olanak tanır.

Hazır Ayarlar

Hazır ayarlar statik nesneler veya fabrika fonksiyonları olabilir:

const presets = [
{ label: "Bugün", value: { start: new Date(), end: new Date() } },
{
label: "Son 30 gün",
value: () => {
const end = new Date();
const start = new Date();
start.setDate(start.getDate() - 29);
return { start, end };
},
},
];

activePresetIndex, mevcut seçimle eşleşen hazır ayarın dizinini veya eşleşen yoksa -1 değerini döndürür.

maxDays / minDays

maxDays ayarlandığında, başlangıç tarihinden itibaren izin verilen aralığın dışındaki tarihler otomatik olarak devre dışı bırakılır. minDays ayarlandığında, başlangıç tarihine çok yakın tarihler devre dışı bırakılır.

shouldCloseOnSelect

Aralık seçiciler için, shouldCloseOnSelect başlangıç tarihi değil, bitiş tarihi seçildiğinde otomatik onayı tetikler.