커스텀 트리거
Trigger 렌더 프롭(render prop)을 사용하여 기본 트리거 버튼을 직접 만든 요소로 교체하세요. DatePicker.Trigger의 자식으로 함수를 전달하면, 원하는 형태의 트리거 UI를 구축할 수 있는 상태(state)와 콜백(callback)을 받을 수 있습니다.
import { useState } from "react";import { DatePicker } from "react-date-range-picker-tailwind4";
function CompoundCustomTrigger() { const [value, setValue] = useState<Date | null>(null);
return ( <DatePicker.Root value={value} onChange={setValue}> <DatePicker.Trigger> {({ displayValue, isOpen, onToggle, triggerRef }) => ( <button ref={triggerRef as React.Ref<HTMLButtonElement>} onClick={onToggle} style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "8px 12px", border: `1px solid ${isOpen ? "#3b82f6" : "#d1d5db"}`, borderRadius: 6, background: isOpen ? "#eff6ff" : "#fff", cursor: "pointer", fontSize: 14, }} > <span style={{ fontSize: 18 }}>{"\uD83D\uDCC5"}</span> <span>{displayValue || "Pick a date"}</span> </button> )} </DatePicker.Trigger> <DatePicker.Content> <DatePicker.Header> <DatePicker.PrevButton /> <DatePicker.Title /> <DatePicker.NextButton /> </DatePicker.Header> <DatePicker.Grid /> <DatePicker.Footer> <DatePicker.ClearButton /> <DatePicker.CancelButton /> <DatePicker.ConfirmButton /> </DatePicker.Footer> </DatePicker.Content> </DatePicker.Root> );}트리거 렌더 프롭
| Prop | Type | 설명 |
|---|---|---|
displayValue | string | 포맷된 선택 날짜 |
placeholder | string | 플레이스홀더 텍스트 |
hasValue | boolean | 날짜 선택 여부 |
isOpen | boolean | 팝업 열림 여부 |
onToggle | () => void | 팝업 열기/닫기 토글 |
onClear | () => void | 선택 초기화 |
locale | Locale | 현재 로케일 객체 |
triggerRef | (node) => void | 위치 지정을 위한 Ref 콜백 |
범위 선택기 트리거
동일한 패턴이 DateRangePicker에서도 작동합니다:
import { useState } from "react";import { DateRangePicker } from "react-date-range-picker-tailwind4";
function CompoundCustomTriggerRange() { const [value, setValue] = useState<{ start: Date | null; end: Date | null }>({ start: null, end: null, });
return ( <DateRangePicker.Root value={value} onChange={setValue}> <DateRangePicker.Trigger> {({ displayValue, isOpen, onToggle, triggerRef }) => ( <button ref={triggerRef as React.Ref<HTMLButtonElement>} onClick={onToggle} style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "8px 16px", border: `2px solid ${isOpen ? "#3b82f6" : "#d1d5db"}`, borderRadius: 8, background: isOpen ? "#eff6ff" : "#fff", cursor: "pointer", fontSize: 14, fontWeight: 500, transition: "border-color 0.15s, background 0.15s", }} > <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" > <rect x="3" y="4" width="18" height="18" rx="2" ry="2" /> <line x1="16" y1="2" x2="16" y2="6" /> <line x1="8" y1="2" x2="8" y2="6" /> <line x1="3" y1="10" x2="21" y2="10" /> </svg> <span>{displayValue || "Select date range"}</span> </button> )} </DateRangePicker.Trigger> <DateRangePicker.Content> <div> <DateRangePicker.Header> <DateRangePicker.PrevButton /> <DateRangePicker.Title calendarIndex={0} /> <div style={{ flex: 1 }} /> <DateRangePicker.Title calendarIndex={1} /> <DateRangePicker.NextButton /> </DateRangePicker.Header> <DateRangePicker.Calendars> <DateRangePicker.Grid calendarIndex={0} /> <DateRangePicker.Grid calendarIndex={1} /> </DateRangePicker.Calendars> <DateRangePicker.Footer> <DateRangePicker.ClearButton /> <DateRangePicker.CancelButton /> <DateRangePicker.ConfirmButton /> </DateRangePicker.Footer> </div> </DateRangePicker.Content> </DateRangePicker.Root> );}