DatePicker 日期选择器
用于选择日期。
需要同时选择时间时,使用 DateTimePicker;需要起止区间时,使用 DateRangePicker。
基础选择
点击控件打开日历,选择日期后收起。defaultValue 设置初始日期,disabled 禁用整个控件。
import { DatePicker, Form, FormField } from '@ifhover/leaf-ui';
export function DatePickerBasic() {
return (
<Form layout="vertical">
<FormField label="选择日期">
<DatePicker aria-label="选择日期" placeholder="选择一个好日子" />
</FormField>
<FormField label="默认日期">
<DatePicker aria-label="默认日期" defaultValue={new Date(2026, 9, 15)} />
</FormField>
<FormField label="禁用日期">
<DatePicker aria-label="禁用日期" defaultValue={new Date(2026, 9, 15)} disabled />
</FormField>
</Form>
);
}
受控与日期限制
通过 minDate / maxDate 限定可选日期,边界当天也可以选择。onChange 同时提供 Date 对象和本地日期字符串。
import { DatePicker, Form, FormField, Text } from '@ifhover/leaf-ui';
import { useState } from 'react';
export function DatePickerControlled() {
const [date, setDate] = useState<Date | null>(new Date(2026, 9, 15));
const [dateString, setDateString] = useState('2026-10-15');
return (
<Form layout="vertical">
<FormField label="十月的日期">
<DatePicker
aria-label="十月的日期"
value={date}
minDate={new Date(2026, 9, 5)}
maxDate={new Date(2026, 9, 25)}
onChange={(next, text) => {
setDate(next);
setDateString(text);
}}
/>
</FormField>
<Text tone="muted">可选 10 月 5–25 日,当前值:{dateString || '未选择'}</Text>
<FormField label="必填日期 · 错误">
<DatePicker aria-label="必填日期" status="error" required placeholder="请设置截止日期" />
</FormField>
</Form>
);
}
快捷日期
通过 todayText 修改今天按钮文字,renderExtraFooter 增加快捷操作,showToday=false 隐藏今天按钮。
import { Button, DatePicker, Flex, Text } from '@ifhover/leaf-ui';
import { useState } from 'react';
export function DatePickerFooter() {
const [value, setValue] = useState<Date | null>(null);
const tomorrow = () => {
const next = new Date();
next.setDate(next.getDate() + 1);
next.setHours(0, 0, 0, 0);
setValue(next);
};
return (
<Flex direction="column" gap="sm" align="start">
<Text>自定义快捷日期</Text>
<DatePicker
aria-label="自定义快捷日期"
value={value}
onChange={setValue}
todayText="今天"
renderExtraFooter={
<Button variant="ghost" size="sm" onClick={tomorrow}>
明天
</Button>
}
/>
</Flex>
);
}
扩展用法
import { DatePicker, Space } from '@ifhover/leaf-ui';
export function ExtensionDemo() {
return (
<Space wrap>
{(['year', 'quarter', 'month', 'week'] as const).map((picker) => (
<label key={picker} htmlFor={`period-${picker}`}>
{{ year: '年份', quarter: '季度', month: '月份', week: '周' }[picker]}
<DatePicker id={`period-${picker}`} picker={picker} />
</label>
))}
</Space>
);
}
格式、预设与多日期
import { DatePicker, Flex, Space, Text } from '@ifhover/leaf-ui';
export function Capabilities() {
return (
<Space direction="vertical" align="stretch">
<Flex direction="column" gap="sm" align="center">
<Text>
{'自定义显示格式与工作日限制'}
</Text>
<DatePicker
format="DD/MM/YYYY"
disabledDate={(date) => date.getDay() === 0 || date.getDay() === 6}
presets={[{ label: '今天', value: () => new Date() }]}
/>
</Flex>
<Flex direction="column" gap="sm" align="center">
<Text>{'选择最多三个日期'}</Text>
<DatePicker multiple maxCount={3} format="MM/DD" />
</Flex>
</Space>
);
}
显示格式与提交值
format 改变显示文字和 onChange 的字符串参数;FormData 保持日期或周期的稳定序列化格式。方括号可以转义固定文字,例如 YYYY-[Q]Q。使用函数格式化时,请同时提供 parse。Date 表示本地日历值,业务时区在应用的数据边界完成转换。周起点通过 ConfigProvider 的 weekStartsOn 设置。
DatePicker API
其余原生 input 属性和 aria-* 透传至输入框;className / style 作用于外层容器。
类型
可导入 DatePickerProps 定义组件属性,或单独使用尺寸、校验状态类型:
import type { DatePickerProps, ControlSize, ControlStatus } from '@ifhover/leaf-ui';
日期与表单
传入有效 Date 对象,且 minDate 不晚于 maxDate。组件按本地日期处理:可用 new Date(2026, 9, 15) 表示 2026 年 10 月 15 日,月份从 0 开始。选择结果为本地当天零点;避免用 UTC 字符串转换代替本地日期构造。
设置 name 后,FormData 提交当前 picker 模式的字符串,清除后为空字符串。非受控组件支持表单 reset,受控组件需同步重置自己的状态。年、季度、月、周模式的 Date 值为对应周期的起始日期,日历从默认周一开始,可通过 ConfigProvider 的 weekStartsOn 修改。
键盘与主题
点击控件打开日历,↓ 移入日历。方向键按日或周移动,Home / End 移至本周首尾,PageUp / PageDown 切换月份,Enter 选择。Tab 依次访问月切换与日期;离开面板时回到表单中的后续控件,Escape 收起并聚焦输入框。
为控件提供 label 或 aria-label。日历沿用控件所在容器的主题色、圆角和浅深色变量;点击外部或移走焦点会收起。
可以直接输入 YYYY-MM-DD,按 Enter 或移走焦点提交。无效日期和超出 minDate / maxDate 的值不会提交。点击日历顶部的月份、年份可切换选择面板;默认展示“今天”快捷按钮,可通过 showToday、todayText 与 renderExtraFooter 定制。
点击输入框保留输入焦点;↓ 将焦点移入日历,Escape 放弃未完成输入。
各模式格式:date → YYYY-MM-DD、year → YYYY、quarter → YYYY-QN、month → YYYY-MM、week → YYYY-Www。显示、手动输入、onChange 字符串和 FormData 使用相同格式。
SingleDatePicker API
MultipleDatePicker API
DatePreset