사용자 정의 트리거

기본 트리거를 원하는 버튼이나 입력 필드로 교체하세요. Trigger 컴포넌트는 렌더 프롭(render prop)을 통해 트리거의 모양과 동작을 완벽하게 제어할 수 있도록 지원합니다.

import { useState } from "react";
import { DatePicker } from "react-date-range-picker-styled";
import "react-date-range-picker-styled/rdrp-styles.css";
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 #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타입설명
displayValuestring선택된 날짜의 포맷된 값
placeholderstring플레이스홀더 텍스트
hasValueboolean날짜 선택 여부
isOpenboolean팝업 열림 여부
onToggle() => void팝업 열기/닫기 토글
onClear() => void선택 값 지우기
localeLocale현재 로케일 객체
triggerRef(node) => void위치 지정을 위한 ref 콜백

범위 선택기 트리거

동일한 패턴이 DateRangePicker에도 적용됩니다:

import { useState } from "react";
import { DateRangePicker } from "react-date-range-picker-styled";
import "react-date-range-picker-styled/rdrp-styles.css";
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>
);
}