DatePicker 日期选择框

如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @alifd/next@latest -S

Guide

输入或选择日期的控件。当用户需要输入一个日期,可以点击标准输入框,弹出日期面板进行选择。

日期选择模式

DatePicker/RangePicker 在交互上增加了操作焦点的设置,意味着,如果某个输入框处于 focus 态,那么当前选择的日期将会作用于该输入框对应的日期。

如上图所示,带时间的 RangePicker 有 4 个输入焦点,分别为开始日期、开始时间、结束日期、结束时间。当用户激活某个输入框时,此时下拉选择的日期将会作用域该输入框。同时设置了如下两个规则:

  • 已选定日期范围后,当焦点在开始日期时,如果即将选择的日期大于结束日期,将会重设开始日期。

  • 已选定日期范围后,当焦点在结束日期时,如果即将选择的日期小于开始日期,将会重设开始日期。

日期值的多语言

由于 Calendar 组件内部使用 moment 对象来设置日期(请使用最新版 moment),部分 Locale 读取自 moment,因此用户需要在外部使用时正确的设置 moment 的 locale

  • Q: 文档站点上看是中式日历,为什么我本地却是美式日历呢?如何进行多语言适配?A: 日期的多语言情况比较复杂,涉及到年、月、日、星期、阅读习惯等多方面(美式从周日到周六,中式从周一到周日),因此我们借助了成熟的时间库 moment.js 来进行日期的多语言处理。 moment.js 默认支持美式表达,如需中文等其他语言,请引入moment-with-locales.js语言包。
  1. import moment from 'moment';
  2. moment.locale('zh-cn');

此外,当改变 moment 的全局 locale 时并不会修改之前的已有实例,例如:

  1. moment.locale('fr');
  2. const m = moment(1316116057189);
  3. m.fromNow(); // il y a une heure
  4. moment.locale('en');
  5. m.fromNow(); // il y a une heure
  6. moment(1316116057189).fromNow(); // an hour ago

除了全局设置 moment 的多语言,还可以只对某个 moment 实例设置多语言。比如:

  1. const value = moment();
  2. value.locale('fr'); // set this instance to use French

Moment 对象和字符串

DatePicker 默认情况下接收和返回的数据类型都是 Moment 对象。为了便于用户的使用,DatePikcer 还支持直接传入字符串(组件内部仍然会格式化为 Moment 对象)。使用方法如下:

标准非受控

  1. <DatePicker onChange={val => console.log(val)} />
  2. // select 2019-01-23
  3. // >> MomentObject
  4. <DatePicker defaultValue={moment()} onChange={val => console.log(val)} />
  5. // select 2019-01-23
  6. // >> MomentObject
  7. <DatePicker defaultValue="2018-01-23" onChange={val => console.log(val)} />
  8. // select 2019-01-23
  9. // >> "2019-01-23"

标准受控

  1. <DatePicker value={moment()} onChange={val => console.log(val)} />
  2. // setProps({ value: moment().add(1, 'months') })
  3. // >> MomentObject
  4. <DatePicker value="2018-01-23" onChange={val => console.log(val)} />
  5. // setProps({ value: '2019-01-23' })
  6. // >> "2019-01-23"

API

DatePicker

参数说明类型默认值
label输入框内置标签ReactNode-
size输入框尺寸可选值:'small', 'medium', 'large'Enum'medium'
state输入框状态可选值:'success', 'loading', 'error'Enum-
placeholder输入提示String-
defaultVisibleMonth默认展现的月签名:Function() => MomentObject返回值:{MomentObject} 返回包含指定月份的 moment 对象实例Function-
value日期值(受控)moment 对象custom-
defaultValue初始日期值,moment 对象custom-
format日期值的格式(用于限定用户输入和展示)String'YYYY-MM-DD'
showTime是否使用时间控件,传入 TimePicker 的属性 { defaultValue, format, … }Object/Booleanfalse
resetTime每次选择日期时是否重置时间(仅在 showTime 开启时有效)Booleanfalse
disabledDate禁用日期函数签名:Function(日期值: MomentObject, view: String) => Boolean参数:日期值: {MomentObject} nullview: {String} 当前视图类型,year: 年, month: 月, date: 日返回值:{Boolean} 是否禁用Function() => false
footerRender自定义面板页脚签名:Function() => Node返回值:{Node} 自定义的面板页脚组件Function() => null
onChange日期值改变时的回调签名:Function(value: MomentObject/String) => void参数:value: {MomentObject/String} 日期值Functionfunc.noop
onOk点击确认按钮时的回调签名:Function() => MomentObject/String返回值:{MomentObject/String} 日期值Functionfunc.noop
disabled是否禁用Boolean-
hasClear是否显示清空按钮Booleantrue
visible弹层显示状态Boolean-
defaultVisible弹层默认是否显示Booleanfalse
onVisibleChange弹层展示状态变化时的回调签名:Function(visible: Boolean, type: String) => void参数:visible: {Boolean} 弹层是否显示type: {String} 触发弹层显示和隐藏的来源 calendarSelect 表示由日期表盘的选择触发; okBtnClick 表示由确认按钮触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发Functionfunc.noop
popupTriggerType弹层触发方式可选值:'click', 'hover'Enum'click'
popupAlign弹层对齐方式,具体含义见 OverLay文档String'tl tl'
popupContainer弹层容器签名:Function(target: Element) => Element参数:target: {Element} 目标元素返回值:{Element} 弹层的容器元素Function-
popupStyle弹层自定义样式Object-
popupClassName弹层自定义样式类String-
popupProps弹层其他属性Object-
followTrigger是否跟随滚动Boolean-
inputProps输入框其他属性Object-
dateCellRender自定义日期渲染函数签名:Function(value: Object) => ReactNode参数:value: {Object} 日期值(moment对象)返回值:{ReactNode} nullFunction-
monthCellRender自定义月份渲染函数签名:Function(calendarDate: Object) => ReactNode参数:calendarDate: {Object} 对应 Calendar 返回的自定义日期对象返回值:{ReactNode} nullFunction-
dateInputAriaLabel日期输入框的 aria-label 属性String-
timeInputAriaLabel时间输入框的 aria-label 属性String-

DatePicker.MonthPicker

参数说明类型默认值
label输入框内置标签ReactNode-
size输入框尺寸可选值:'small', 'medium', 'large'Enum'medium'
state输入框状态可选值:'success', 'loading', 'error'Enum-
placeholder输入提示String-
defaultVisibleYear默认展现的年签名:Function() => MomentObject返回值:{MomentObject} 返回包含指定年份的 moment 对象实例Function-
value日期值(受控)moment 对象custom-
defaultValue初始日期值,moment 对象custom-
format日期值的格式(用于限定用户输入和展示)String'YYYY-MM'
disabledDate禁用日期函数签名:Function(日期值: MomentObject, view: String) => Boolean参数:日期值: {MomentObject} nullview: {String} 当前视图类型,year: 年, month: 月, date: 日返回值:{Boolean} 是否禁用Function() => false
footerRender自定义面板页脚签名:Function() => Node返回值:{Node} 自定义的面板页脚组件Function() => null
onChange日期值改变时的回调签名:Function(value: MomentObject/String) => void参数:value: {MomentObject/String} 日期值Functionfunc.noop
disabled是否禁用Boolean-
hasClear是否显示清空按钮Booleantrue
visible弹层显示状态Boolean-
defaultVisible弹层默认是否显示Boolean-
onVisibleChange弹层展示状态变化时的回调签名:Function(visible: Boolean, type: String) => void参数:visible: {Boolean} 弹层是否显示type: {String} 触发弹层显示和隐藏的来源 calendarSelect 表示由日期表盘的选择触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发Functionfunc.noop
popupTriggerType弹层触发方式可选值:'click', 'hover'Enum'click'
popupAlign弹层对齐方式, 具体含义见 OverLay文档String'tl tl'
popupContainer弹层容器签名:Function(target: Element) => Element参数:target: {Element} 目标元素返回值:{Element} 弹层的容器元素Function-
popupStyle弹层自定义样式Object-
popupClassName弹层自定义样式类String-
popupProps弹层其他属性Object-
followTrigger是否跟随滚动Boolean-
inputProps输入框其他属性Object-
monthCellRender自定义月份渲染函数签名:Function(calendarDate: Object) => ReactNode参数:calendarDate: {Object} 对应 Calendar 返回的自定义日期对象返回值:{ReactNode} nullFunction-
dateInputAriaLabel日期输入框的 aria-label 属性String-

DatePicker.RangePicker

参数说明类型默认值
defaultVisibleMonth默认展示的起始月份签名:Function() => MomentObject返回值:{MomentObject} 返回包含指定月份的 moment 对象实例Function-
size输入框尺寸可选值:'small', 'medium', 'large'Enum'medium'
value日期范围值数组 moment, momentArray-
defaultValue初始的日期范围值数组 moment, momentArray-
format日期格式String'YYYY-MM-DD'
showTime是否使用时间控件,支持传入 TimePicker 的属性Object/Booleanfalse
resetTime每次选择是否重置时间(仅在 showTime 开启时有效)Booleanfalse
disabledDate禁用日期函数签名:Function(日期值: MomentObject, view: String) => Boolean参数:日期值: {MomentObject} nullview: {String} 当前视图类型,year: 年, month: 月, date: 日返回值:{Boolean} 是否禁用Function() => false
footerRender自定义面板页脚签名:Function() => Node返回值:{Node} 自定义的面板页脚组件Function() => null
onChange日期范围值改变时的回调 [ MomentObjectString, MomentObjectString ]签名:Function(value: Array) => void参数:value: {Array} 日期值Functionfunc.noop
onOk点击确认按钮时的回调 返回开始时间和结束时间[ MomentObject|String, MomentObject|String ]签名:Function() => Array返回值:{Array} 日期范围Functionfunc.noop
label输入框内置标签ReactNode-
state输入框状态可选值:'error', 'loading', 'success'Enum-
disabled是否禁用Boolean-
hasClear是否显示清空按钮Booleantrue
visible弹层显示状态Boolean-
defaultVisible弹层默认是否显示Booleanfalse
onVisibleChange弹层展示状态变化时的回调签名:Function(visible: Boolean, type: String) => void参数:visible: {Boolean} 弹层是否显示type: {String} 触发弹层显示和隐藏的来源 okBtnClick 表示由确认按钮触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发Functionfunc.noop
popupTriggerType弹层触发方式可选值:'click', 'hover'Enum'click'
popupAlign弹层对齐方式, 具体含义见 OverLay文档String'tl tl'
popupContainer弹层容器签名:Function(target: Element) => Element参数:target: {Element} 目标元素返回值:{Element} 弹层的容器元素Function-
popupStyle弹层自定义样式Object-
popupClassName弹层自定义样式类String-
popupProps弹层其他属性Object-
followTrigger是否跟随滚动Boolean-
inputProps输入框其他属性Object-
dateCellRender自定义日期单元格渲染签名:Function() => voidFunction-
monthCellRender自定义月份渲染函数签名:Function(calendarDate: Object) => ReactNode参数:calendarDate: {Object} 对应 Calendar 返回的自定义日期对象返回值:{ReactNode} nullFunction-
startDateInputAriaLabel开始日期输入框的 aria-label 属性String-
startTimeInputAriaLabel开始时间输入框的 aria-label 属性String-
endDateInputAriaLabel结束日期输入框的 aria-label 属性String-
endTimeInputAriaLabel结束时间输入框的 aria-label 属性String-

DatePicker.YearPicker

参数说明类型默认值
label输入框内置标签ReactNode-
size输入框尺寸可选值:'small', 'medium', 'large'Enum'medium'
state输入框状态可选值:'success', 'loading', 'error'Enum-
placeholder输入提示String-
value日期值(受控)moment 对象custom-
defaultValue初始日期值,moment 对象custom-
format日期值的格式(用于限定用户输入和展示)String'YYYY'
disabledDate禁用日期函数签名:Function(日期值: MomentObject, view: String) => Boolean参数:日期值: {MomentObject} nullview: {String} 当前视图类型,year: 年, month: 月, date: 日返回值:{Boolean} 是否禁用Function() => false
footerRender自定义面板页脚签名:Function() => Node返回值:{Node} 自定义的面板页脚组件Function() => null
onChange日期值改变时的回调签名:Function(value: MomentObject/String) => void参数:value: {MomentObject/String} 日期值Functionfunc.noop
disabled是否禁用Boolean-
hasClear是否显示清空按钮Booleantrue
visible弹层显示状态Boolean-
defaultVisible弹层默认是否显示Boolean-
onVisibleChange弹层展示状态变化时的回调签名:Function(visible: Boolean, reason: String) => void参数:visible: {Boolean} 弹层是否显示reason: {String} 触发弹层显示和隐藏的来源 calendarSelect 表示由日期表盘的选择触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发Functionfunc.noop
popupTriggerType弹层触发方式可选值:'click', 'hover'Enum'click'
popupAlign弹层对齐方式, 具体含义见 OverLay文档String'tl tl'
popupContainer弹层容器签名:Function(target: Element) => Element参数:target: {Element} 目标元素返回值:{Element} 弹层的容器元素Function-
popupStyle弹层自定义样式Object-
popupClassName弹层自定义样式类String-
popupProps弹层其他属性Object-
followTrigger是否跟随滚动Boolean-
inputProps输入框其他属性Object-
dateInputAriaLabel日期输入框的 aria-label 属性String-

ARIA and KeyBoard

同选择框一样聚焦到 DatePiker 后,需要按下 ENTER 键打开弹出框,选择/输入日期, 通过 TAB 切换日期和时间输入框。

按键说明
数字键需要手动输入日期,指定的日期格式
Enter打开日期选择框或输入后选择日期
Esc关闭日期选择框
Up输入上一天(Month Picker 则是上一个月, Year Picker 则是上一年)
Down输入下一天(Month Picker 则是下一个月, Year Picker 则是下一年)
Page Up输入上一月
Page Down输入下一月
Alt + Page Up输入上一年
Alt + Page Down输入下一年

代码示例

基本用法

最基本的用法。可以通过 onChange 监听选中值的变化。

DatePicker 日期选择框 - 图1

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker, MonthPicker, YearPicker } = DatePicker;
  3. const onChange = val => console.log(val);
  4. ReactDOM.render(<div>
  5. <DatePicker onChange={onChange} /> <br /><br />
  6. <MonthPicker onChange={onChange} /> <br /><br />
  7. <YearPicker onChange={onChange} /> <br /><br />
  8. <RangePicker onChange={onChange} />
  9. </div>, mountNode);

提供默认值

可以通过 defaultValue 属性为日期选择器提供初值,所提供的初值必须为 moment 对象。

DatePicker 日期选择框 - 图2

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. import moment from 'moment';
  3. const { RangePicker, MonthPicker, YearPicker } = DatePicker;
  4. const startValue = moment('2017-11-20', 'YYYY-MM-DD', true);
  5. const endValue = moment('2017-12-15', 'YYYY-MM-DD', true);
  6. const onChange = val => console.log(val);
  7. ReactDOM.render(<div>
  8. <DatePicker defaultValue={startValue} onChange={onChange} /><br /><br />
  9. <MonthPicker defaultValue={startValue} onChange={onChange} /><br /><br />
  10. <YearPicker defaultValue={startValue} onChange={onChange} /><br /><br />
  11. <RangePicker defaultValue={[startValue, endValue]} onChange={onChange} />
  12. </div>, mountNode);

面板的默认展现日期

可以通过 defaultVisibleMonthdefaultVisibleYear 属性可以修改面板的默认展现日期。

DatePicker 日期选择框 - 图3

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. import moment from 'moment';
  3. const { RangePicker, MonthPicker } = DatePicker;
  4. function onVisibleMonthChange(val, reason) {
  5. console.log(val.format('L'), reason);
  6. }
  7. ReactDOM.render(<div>
  8. <p>Setting last month as default visible month</p>
  9. <DatePicker defaultVisibleMonth={() => moment().add(-1, 'months')} onVisibleMonthChange={onVisibleMonthChange} />
  10. <br /><br />
  11. <RangePicker defaultVisibleMonth={() => moment().add(-1, 'months')} onVisibleMonthChange={onVisibleMonthChange} />
  12. <br /><br />
  13. <p>Setting 2017 as default visible year</p>
  14. <MonthPicker defaultVisibleYear={() => moment('2017', 'YYYY')} />
  15. </div>, mountNode);

不同尺寸

通过 size 属性可以改变 Input 组件的尺寸,默认为 medium

DatePicker 日期选择框 - 图4

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. ReactDOM.render(<div>
  3. <DatePicker size="large" /> &nbsp;&nbsp;
  4. <DatePicker /> &nbsp;&nbsp;
  5. <DatePicker size="small" />
  6. </div>, mountNode);

禁止选择某些日期

可以通过 disabledDate 属性来禁止用户选择或输入某些特定日期。

DatePicker 日期选择框 - 图5

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. import moment from 'moment';
  3. const { RangePicker, MonthPicker, YearPicker } = DatePicker;
  4. const currentDate = moment();
  5. // Disable all dates before today
  6. const disabledDate = function (date, view) {
  7. switch (view) {
  8. case 'date':
  9. return date.valueOf() <= currentDate.valueOf();
  10. case 'year':
  11. return date.year() < currentDate.year();
  12. case 'month':
  13. return date.year() * 100 + date.month() < currentDate.year() * 100 + currentDate.month();
  14. default: return false;
  15. }
  16. };
  17. ReactDOM.render(<div>
  18. <DatePicker disabledDate={disabledDate} onChange={val => console.log(val)} /><br /><br />
  19. <MonthPicker disabledDate={disabledDate} onChange={val => console.log(val)} /><br /><br />
  20. <YearPicker disabledDate={disabledDate} onChange={val => console.log(val)} /><br /><br />
  21. <RangePicker disabledDate={disabledDate} onChange={val => console.log(val)} />
  22. </div>, mountNode);

日期时间选择

如果需要同时选择时间,可以通过 showTime 属性开启,showTime 支持传入 TimePickerPanel 的属性,例如 format, defaultValue 等。

DatePicker 日期选择框 - 图6

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. import moment from 'moment';
  3. const { RangePicker } = DatePicker;
  4. const onChange = (value) => console.log(value);
  5. const onOk = (value) => console.log('onOK:', value.format('YYYY-MM-DD HH:mm:ss'));
  6. const onRangeOk = (value) => console.log('onOk: [%s, %s]', value[0].format('YYYY-MM-DD HH:mm:ss'), value[1].format('YYYY-MM-DD HH:mm:ss'));
  7. const defaultTimeValue = moment('09:00:00', 'HH:mm:ss', true);
  8. ReactDOM.render(<div>
  9. <p>DatePicker With Time</p>
  10. <DatePicker showTime onChange={onChange} onOk={onOk} />
  11. <p>DatePicker with Time, reset 00:00:00 for every select</p>
  12. <DatePicker showTime onChange={onChange} onOk={onOk} resetTime />
  13. <p>DatePicker with Time, with default time value</p>
  14. <DatePicker showTime={{ defaultValue: defaultTimeValue, secondStep: 10 }} onChange={onChange} onOk={onOk} />
  15. <p>RangePicker with Time</p>
  16. <RangePicker showTime onChange={onChange} onOk={onRangeOk} />
  17. <p>RangePicker with Time, reset 00:00:00 for every select</p>
  18. <RangePicker showTime resetTime onChange={onChange} onOk={onRangeOk} />
  19. <p>RangePicker with Time, with default time value, hide seconds</p>
  20. <RangePicker showTime={{ defaultValue: defaultTimeValue, format: 'HH:mm', minuteStep: 15 }} onChange={onChange} onOk={onRangeOk} />
  21. </div>, mountNode);

禁用日期选择

当开启 disabled 属性时,选择框处于完全禁用状态。

DatePicker 日期选择框 - 图7

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker } = DatePicker;
  3. ReactDOM.render(<div>
  4. <DatePicker disabled />&nbsp;&nbsp;<RangePicker disabled />
  5. </div>, mountNode);

日期格式

通过 format 属性可以约束日期选择器的日期格式,该格式同时会限定用户的输入格式。

DatePicker 日期选择框 - 图8

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker } = DatePicker;
  3. const onChange = val => console.log(val);
  4. ReactDOM.render(<div>
  5. <DatePicker format="YYYY-M-D" onChange={onChange} />
  6. <br /><br />
  7. <DatePicker format="YYYY-M-D" onChange={onChange} showTime={{ format: 'HH:mm' }} />
  8. <br /><br />
  9. <RangePicker format="YYYY-M-D" onChange={onChange} />
  10. <br /><br />
  11. <RangePicker format="YYYY-M-D" onChange={onChange} showTime={{ format: 'HH:mm' }} />
  12. </div>, mountNode);

自定义日期范围选择

如果默认的 RangePicker 在交互上无法满足您的使用需求,还可以基于 DatePicker 封装实现类似的功能。例如,示例中的日期选择可以自由的更改开始或结束日期,而不必每次选择时重置日期。

DatePicker 日期选择框 - 图9

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. class CustomRangePicker extends React.Component {
  3. constructor(props, context) {
  4. super(props, context);
  5. this.state = {
  6. startValue: null,
  7. endValue: null,
  8. endOpen: false
  9. };
  10. }
  11. disabledStartDate = (startValue) => {
  12. const { endValue } = this.state;
  13. if (!startValue || !endValue) {
  14. return false;
  15. }
  16. return startValue.valueOf() > endValue.valueOf();
  17. }
  18. disabledEndDate = (endValue) => {
  19. const { startValue } = this.state;
  20. if (!endValue || !startValue) {
  21. return false;
  22. }
  23. return endValue.valueOf() <= startValue.valueOf();
  24. }
  25. onChange = (stateName, value) => {
  26. this.setState({
  27. [stateName]: value
  28. });
  29. }
  30. onStartChange = (value) => {
  31. this.onChange('startValue', value);
  32. }
  33. onEndChange = value => {
  34. this.onChange('endValue', value);
  35. }
  36. handleStartOpenChange = (open) => {
  37. if (!open) {
  38. this.setState({ endOpen: true });
  39. }
  40. }
  41. handleEndOpenChange = (open) => {
  42. this.setState({ endOpen: open });
  43. }
  44. render() {
  45. const { endOpen } = this.state;
  46. return (
  47. <div>
  48. <DatePicker
  49. disabledDate={this.disabledStartDate}
  50. placeholder="Departure Date"
  51. onChange={this.onStartChange}
  52. onVisibleChange={this.handleStartOpenChange}
  53. />
  54. <span className="custom-sep">-</span>
  55. <DatePicker
  56. disabledDate={this.disabledEndDate}
  57. placeholder="Return Date"
  58. onChange={this.onEndChange}
  59. visible={endOpen}
  60. onVisibleChange={this.handleEndOpenChange}
  61. />
  62. </div>
  63. );
  64. }
  65. }
  66. ReactDOM.render(<div>
  67. <CustomRangePicker />
  68. </div>, mountNode);
  1. .custom-sep {
  2. margin: 0 6px;
  3. color: #999;
  4. }

自定义日期选择器弹层

组件对外透出了 visible, defaultVisible, onVisibleChange, popupTriggerType, popupAlign, popupContainer, popupStyle, popupClassName 等属性用于直接定制弹层。此外,如果这些属性仍然无法满足需求,可以通过 popupProps 进行透传。

DatePicker 日期选择框 - 图10

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker } = DatePicker;
  3. ReactDOM.render(<div>
  4. <p>Change popup align</p>
  5. <DatePicker popupAlign="bl tl" />
  6. <p>Change popup container</p>
  7. <RangePicker popupContainer={target => target.parentNode} />
  8. </div>, mountNode);

自定义面板页脚

可以通过 footerRender 自定义对面板页脚的定制。

DatePicker 日期选择框 - 图11

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker } = DatePicker;
  3. function footerRender() {
  4. return <div className="custom-footer">👍 Some useful info here</div>;
  5. }
  6. ReactDOM.render(<div>
  7. <DatePicker footerRender={footerRender} />&nbsp;&nbsp;
  8. <RangePicker footerRender={footerRender} />
  9. </div>, mountNode);
  1. .custom-footer {
  2. padding: 12px;
  3. font-size: 12px;
  4. border-top: 1px solid #DCDEE3;
  5. }

与 Field 结合

与 Field 结合使用,简单示范自定义返回值

DatePicker 日期选择框 - 图12

查看源码在线预览

  1. import { DatePicker, Field, Button } from '@alifd/next';
  2. const { RangePicker, YearPicker, MonthPicker } = DatePicker;
  3. class App extends React.Component {
  4. field = new Field(this);
  5. printData = () => {
  6. this.field.validate((err, values) => {
  7. if (err) {
  8. console.error('Error: ', err);
  9. return;
  10. }
  11. console.log('datepicker: %s', values.date.format('YYYY-MM-DD'));
  12. console.log('monthpicker: %s', values.month.format('YYYY-MM'));
  13. console.log('yearpicker: %s', values.year.format('YYYY'));
  14. const range = values.range;
  15. console.log('rangepicker: [%s, %s]', range[0] && range[0].format('YYYY-MM-DD'), range[1] && range[1].format('YYYY-MM-DD'));
  16. });
  17. }
  18. printError = (name) => {
  19. if (this.field.getError(name)) {
  20. return <span className="error-msg">{this.field.getError(name).join(',')}</span>;
  21. }
  22. }
  23. render() {
  24. const init = this.field.init;
  25. return (
  26. <div>
  27. <DatePicker {...init('date', { rules: [{
  28. required: true,
  29. message: '请选择日期'
  30. }] })} />{this.printError('date')}<br /><br />
  31. <MonthPicker {...init('month', { rules: [{
  32. required: true,
  33. message: '请选择月份'
  34. }] })} />{this.printError('month')}<br /><br />
  35. <YearPicker {...init('year', { rules: [{
  36. required: true,
  37. message: '请选择年份'
  38. }] })} />{this.printError('year')}<br /><br />
  39. <RangePicker {...init('range', { rules: [{
  40. required: true,
  41. message: '请选择日期范围'
  42. }] })} />{this.printError('range')}<br /><br />
  43. <Button onClick={this.printData}>Print to Console</Button>
  44. </div>
  45. );
  46. }
  47. }
  48. ReactDOM.render(<App/>, mountNode);
  1. .error-msg {
  2. color: #E72B00;
  3. font-size: 12px;
  4. }

无障碍

支持手动输入或键盘操作,请参考ARIA and KeyBoard

DatePicker 日期选择框 - 图13

查看源码在线预览

  1. import { DatePicker } from '@alifd/next';
  2. const { RangePicker, MonthPicker, YearPicker } = DatePicker;
  3. const onChange = val => console.log(val);
  4. ReactDOM.render(<div>
  5. <DatePicker dateInputAriaLabel="date input" inputProps={{"aria-label": "date picker main"}} onChange={onChange} /> <br /><br />
  6. <RangePicker startDateInputAriaLabel="start date" startTimeInputAriaLabel="start time" endDateInputAriaLabel="end date" endTimeInputAriaLabel="end time" onChange={onChange} inputProps={{"aria-label": "range picker main"}} />
  7. </div>, mountNode);

相关区块

DatePicker 日期选择框 - 图14

暂无相关区块