DatePicker 日期选择框

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

安装方法

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

Guide

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

API

日期选择框

参数说明类型默认值
prefix品牌样式前缀String'next-'
defaultBase默认的基准日期String-
defaultValue默认日期any-
value日期值any-
onChange时间发生改变时的回调函数签名:Function(date: String, formatDate: String) => void参数:date: {String} 改变后的日期formatDate: {String} 改变后的格式化日期Function() => {}
defaultOpen是否默认展开Boolean-
open是否展开Boolean-
onOpenChange当面板展开状态改变时的回调函数签名:Function(open: Boolean) => void参数:open: {Boolean} 面板的展开状态Function() => {}
size输入框大小可选值:'small', 'medium', 'large'Enum'medium'
language语言可选值:'en-us', 'ar', 'de', 'es', 'fr', 'hi', 'it', 'ja', 'ko', 'pt', 'ru', 'zh-cn', 'zh-hk', 'zh-tw'Enum-
locale国际化配置, 参考Object-
popupStyle弹层面板样式Object-
popupAlign弹层对齐方式String'tl tl'
popupOffset弹层偏移Array0, 0
format输出日期值格式化String/Function-
formater日期格式化(可替代 format)Array'YYYY-MM-DD', 'HH:mm:ss'
disabled是否禁用Boolean-
hasClear是否展示清空按钮Booleantrue
showTime是否展示时间选择或传入 { defaultValue } 设置时间初值Boolean/Object-
readOnly输入框是否只读Booleanfalse
className自定义组件样式String-

DatePicker.MonthPicker

参数说明类型默认值
prefix品牌样式前缀String'next-'
defaultBase默认的基准日期String-
defaultValue默认日期any-
value日期值any-
onChange日期发生改变时的回调签名:Function(date: String, formatDate: String) => void参数:date: {String} 改变后的日期formatDate: {String} 格式化的日期Function() => {}
defaultOpen是否默认展开Boolean-
open是否展开Boolean-
onOpenChange当面板展开变化时的回调签名:Function(open: Boolean) => void参数:open: {Boolean} 面板的展开状态Function() => {}
size输入框大小可选值:'small', 'medium', 'large'Enum'medium'
language语言可选值:'en-us', 'ar', 'de', 'es', 'fr', 'hi', 'it', 'ja', 'ko', 'pt', 'ru', 'zh-cn', 'zh-hk', 'zh-tw'Enum-
locale国际化配置, 参考Object-
popupStyle弹层样式Object-
popupAlign弹层对齐方式String'tl tl'
popupOffset弹层偏移Array0, 0
format展开日期的格式String'YYYY-MM'
disabled是否禁用Boolean-
hasClear是否有清空按钮Booleantrue
readOnly输入框是否只读Booleanfalse
className自定义组件样式String-

DatePicker.RangePicker

参数说明类型默认值
prefix品牌样式前缀String'next-'
defaultBase默认的基准日期String-
defaultValue默认日期值Array-
value日期值Array-
onChange时间发生改变的回调签名:Function(dateRange: Array, formatDateRnage: Array) => void参数:dateRange: {Array} 选中的日期区间数组formatDateRnage: {Array} 格式化后的选中的日期区间数组Function() => {}
onStartChange开始日期变化时的回调签名:Function(date: String) => void参数:date: {String} 开始日期Function() => {}
onEndChange结束日期变化时的回调签名:Function(date: String) => void参数:date: {String} 结束日期Function() => {}
defaultOpen默认是否展开Boolean-
open是否展开Boolean-
onOpenChange当面板展开状态改变时的回调签名:Function(面板的: Boolean) => void参数:面板的: {Boolean} open 状态Function() => {}
size输入框大小可选值:'small', 'medium', 'large'Enum'medium'
language语言可选值:'en-us', 'ar', 'de', 'es', 'fr', 'hi', 'it', 'ja', 'ko', 'pt', 'ru', 'zh-cn', 'zh-hk', 'zh-tw'Enum-
locale国际化配置,参考Object-
popupStyle弹层样式Object-
popupAlign弹层对其方式String'tl tl'
popupOffset弹层偏移Array0, 0
format输出日期的格式String/Function-
formater日期值格式化(可替代 format)Array'YYYY-MM-DD', 'HH:mm:ss'
disabled是否禁用Boolean-
hasClear是否有清空按钮Booleantrue
showTime是否显示时间或传入 { defaultValue } 设置时间初值Boolean/Objectfalse
resetTime重新选择时是否重置时间Booleantrue
ranges用户预设的快捷选择的日期范围Object{}
readOnly输入框是否只读Boolean-
className自定义组件样式String-

DatePicker.YearPicker

参数说明类型默认值
prefix品牌的样式前缀String'next-'
defaultBase默认的基准日期String-
defaultValue默认日期any-
value日期any-
onChange时间发生变化的回调签名:Function(date: String, formateDate: String) => void参数:date: {String} 改变后的日期formateDate: {String} 格式化的日期Function() => {}
defaultOpen默认是否展开Boolean-
open是否展开Boolean-
onOpenChange当面板展开状态改变时的回调签名:Function(open: Boolean) => void参数:open: {Boolean} 面板的展开状态Function() => {}
size输入框尺寸可选值:'small', 'medium', 'large'Enum'medium'
language语言可选值:'en-us', 'ar', 'de', 'es', 'fr', 'hi', 'it', 'ja', 'ko', 'pt', 'ru', 'zh-cn', 'zh-hk', 'zh-tw'Enum-
locale国际化配置,参考Object-
popupStyle弹层样式Object-
popupAlign弹层对齐方式String'tl tl'
popupOffset弹层偏移Array0, 0
format日期格式String'YYYY'
disabled是否禁用Boolean-
hasClear是否展示清空按钮Booleantrue
readOnly输入框是否只读Booleanfalse
className自定义组件样式String-

代码示例

基本用法

最基本的用法。监听了 change 事件, 输入框值改变时控制台有日志显示。

DatePicker 日期选择框 - 图1

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>日期选择</h3>
  6. <DatePicker onChange={(val, str) => console.log(val, str)} />
  7. <h3>月份选择</h3>
  8. <MonthPicker onChange={(val, str) => console.log(val, str)} />
  9. <h3>年份选择</h3>
  10. <YearPicker onChange={(val, str) => console.log(val, str)} />
  11. <h3>区间选择</h3>
  12. <RangePicker
  13. onChange={(val, str) => console.log(val, str)}
  14. onStartChange={(val, str) => console.log(val, str)}
  15. />
  16. </div>,
  17. mountNode
  18. );

自定义日期范围选择

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

DatePicker 日期选择框 - 图2

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  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(field, value) {
  26. this.setState({
  27. [field]: 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 { startValue, endValue, endOpen } = this.state;
  46. return (
  47. <div>
  48. <DatePicker
  49. disabledDate={this.disabledStartDate.bind(this)}
  50. showTime
  51. value={startValue}
  52. placeholder="Start"
  53. onChange={this.onStartChange.bind(this)}
  54. onOpenChange={this.handleStartOpenChange.bind(this)}
  55. />
  56. &nbsp;
  57. <DatePicker
  58. disabledDate={this.disabledEndDate.bind(this)}
  59. showTime
  60. value={endValue}
  61. placeholder="End"
  62. onChange={this.onEndChange.bind(this)}
  63. open={endOpen}
  64. onOpenChange={this.handleEndOpenChange.bind(this)}
  65. />
  66. </div>
  67. );
  68. }
  69. }
  70. ReactDOM.render(
  71. <div>
  72. <CustomRangePicker />
  73. </div>,
  74. mountNode
  75. );

提供默认值

为选择器设置默认值。

DatePicker 日期选择框 - 图3

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>日期选择</h3>
  6. <DatePicker defaultValue={"2017年02月14日"} formater={["YYYY年MM月DD日"]} />
  7. <h3>月份选择</h3>
  8. <MonthPicker defaultValue={"2017-02"} />
  9. <h3>年份选择</h3>
  10. <YearPicker defaultValue={"2017"} />
  11. <h3>区间选择</h3>
  12. <RangePicker defaultValue={["2017-02-14", "2017-03-24"]} />
  13. </div>,
  14. mountNode
  15. );

禁用日期、月份、年份

设置 disabledYear 方法,来确定不可选年份。设置 disabledMonth 方法,来确定不可选月份。设置 disabledDate 方法,来确定不可选日期。

DatePicker 日期选择框 - 图4

查看源码在线预览

  1. import { moment, DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. // 2018不可选
  4. const disabledYear = function(calendarDate) {
  5. return calendarDate.year === 2018;
  6. };
  7. // 五月份不可选
  8. const disabledMonth = function(calendarDate) {
  9. return calendarDate.month === 4;
  10. };
  11. // 选择今天以后的时间
  12. const disabledDate = function(calendarDate) {
  13. const { year, month, date } = calendarDate;
  14. const theDate = moment(`${year}-${month + 1}-${date}`, "YYYY-M-D");
  15. return theDate < new Date().getTime();
  16. };
  17. // 选择本周
  18. const disabledRange = function(calendarDate) {
  19. let ret = false;
  20. const now = moment();
  21. const nowWeek = now.isoWeekday();
  22. const { year, month, date } = calendarDate;
  23. const theDate = moment(`${year}-${month + 1}-${date}`, "YYYY-M-D");
  24. if (!theDate) {
  25. return ret;
  26. }
  27. if (theDate > (7 - nowWeek) * 24 * 60 * 60 * 1000 + now.valueOf()) {
  28. ret = true;
  29. }
  30. if (theDate < now.valueOf() - nowWeek * 24 * 60 * 60 * 1000) {
  31. ret = true;
  32. }
  33. return ret;
  34. };
  35. ReactDOM.render(
  36. <div>
  37. <h3>日期选择</h3>
  38. <DatePicker disabledDate={disabledDate} />
  39. <h3>月份选择</h3>
  40. <MonthPicker disabledMonth={disabledMonth} />
  41. <h3>年份选择</h3>
  42. <YearPicker disabledYear={disabledYear} />
  43. <h3>区间选择</h3>
  44. <RangePicker disabledDate={disabledRange} />
  45. </div>,
  46. mountNode
  47. );

禁用选择框

选择框的不可用状态。

DatePicker 日期选择框 - 图5

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>日期选择</h3>
  6. <DatePicker defaultValue={"2017-02-14"} disabled />
  7. <h3>月份选择</h3>
  8. <MonthPicker defaultValue={"2017-02"} disabled />
  9. <h3>年份选择</h3>
  10. <YearPicker defaultValue={"2017"} disabled />
  11. <h3>区间选择</h3>
  12. <RangePicker defaultValue={["2017-02-14", "2017-03-24"]} disabled />
  13. </div>,
  14. mountNode
  15. );

与 field 结合

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

DatePicker 日期选择框 - 图6

查看源码在线预览

  1. import { DatePicker, Field, Button } from "@icedesign/base";
  2. const { RangePicker } = DatePicker;
  3. class App extends React.Component {
  4. field = new Field(this);
  5. normDate(date, dateStr) {
  6. console.log("normDate:", date, dateStr);
  7. return date.getTime();
  8. }
  9. normRange(date, dateStr) {
  10. console.log(date, dateStr);
  11. return date;
  12. }
  13. render() {
  14. const init = this.field.init;
  15. return (
  16. <div>
  17. <DatePicker
  18. format="YYYY年MM月DD日 "
  19. {...init("datepicker", {
  20. getValueFromEvent: this.normDate
  21. })}
  22. />
  23. <br />
  24. <br />
  25. <RangePicker
  26. {...init("rangepicker", {
  27. getValueFromEvent: this.normRange,
  28. initValue: ["2017-05-01", "2017-05-10"]
  29. })}
  30. />
  31. <br />
  32. <br />
  33. <Button
  34. onClick={() => {
  35. return console.log(this.field.getValues());
  36. }}
  37. >
  38. Console中展示数据
  39. </Button>
  40. </div>
  41. );
  42. }
  43. }
  44. ReactDOM.render(<App />, mountNode);

日期格式化

使用 format 属性,可以自定义你需要的日期显示格式,如 YYYY/MM/DD

DatePicker 日期选择框 - 图7

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>日期选择</h3>
  6. <DatePicker format={"YYYY/MM/DD"} />
  7. <br />
  8. <br />
  9. <DatePicker format={"YYYY年MM月DD日"} />
  10. <h3>月份选择</h3>
  11. <MonthPicker format={"YYYY/MM"} />
  12. <h3>年份选择</h3>
  13. <YearPicker format={"YYYY"} />
  14. <h3>区间选择</h3>
  15. <RangePicker format={"YYYY/MM/DD"} />
  16. </div>,
  17. mountNode
  18. );

多语言

自定义传入多语言文案,可用于组件中所有文案的自定义。

DatePicker 日期选择框 - 图8

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. const locale = {
  4. datePlaceholder: "请选择日期-测试",
  5. monthPlaceholder: "请选择月份-测试",
  6. yearPlaceholder: "请选择年份-测试",
  7. rangeStartPlaceholder: "起始时间-测试",
  8. rangeEndPlaceholder: "结束时间-测试",
  9. now: "此刻-测试",
  10. selectTime: "选择时间-测试",
  11. selectDate: "选择日期-测试",
  12. ok: "确定-测试",
  13. clear: "清除-测试"
  14. };
  15. ReactDOM.render(
  16. <div>
  17. <h3>日期选择</h3>
  18. <DatePicker locale={locale} />
  19. <h3>月份选择</h3>
  20. <MonthPicker locale={locale} />
  21. <h3>年份选择</h3>
  22. <YearPicker locale={locale} />
  23. <h3>区间选择</h3>
  24. <RangePicker locale={locale} />
  25. </div>,
  26. mountNode
  27. );

关于弹出层的自定义配置

关于弹出层的自定义配置

DatePicker 日期选择框 - 图9

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>日期选择</h3>
  6. <DatePicker popupAlign={"bl tl"} />
  7. <h3>月份选择</h3>
  8. <MonthPicker popupAlign={"bl tl"} />
  9. <h3>年份选择</h3>
  10. <YearPicker popupAlign={"bl tl"} />
  11. <h3>区间选择</h3>
  12. <RangePicker popupAlign={"bl tl"} />
  13. </div>,
  14. mountNode
  15. );

用户预设日期范围

可以通过 ranges 属性自定义快捷日期选择。

DatePicker 日期选择框 - 图10

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. const now = new Date();
  4. const start = new Date().setDate(1);
  5. const end = new Date().setDate(7);
  6. const quickRanges = {
  7. Today: [now, now],
  8. "First Week": [start, end]
  9. };
  10. ReactDOM.render(
  11. <div>
  12. <RangePicker
  13. ranges={quickRanges}
  14. onChange={(val, str) => console.log(val, str)}
  15. onStartChange={(val, str) => console.log(val, str)}
  16. />
  17. <br />
  18. <br />
  19. <RangePicker
  20. ranges={quickRanges}
  21. onChange={(val, str) => console.log(val, str)}
  22. onStartChange={(val, str) => console.log(val, str)}
  23. showTime
  24. />
  25. </div>,
  26. mountNode
  27. );

与时间选择联动

通过设置 showTime 属性,可以设置包含时间选择控件的日期组件。showTime 属性支持两种设置方式,通常可以传入 bool 值表示是否启动时间选择控件。如果用户有预设时间初值的需求,showTime 属性支持传入对象的方式设置时间初值,设置方式为设置 showTime.defaultValue ,推荐使用 moment 对时间值进行格式化。

DatePicker 日期选择框 - 图11

查看源码在线预览

  1. import { DatePicker, moment } from "@icedesign/base";
  2. const { MonthPicker, YearPicker, RangePicker } = DatePicker;
  3. ReactDOM.render(
  4. <div>
  5. <h3>普通的日期时间选择</h3>
  6. <DatePicker showTime onChange={(a, b) => console.log(a, b)} />
  7. <h3>设置时间初值的日期时间选择</h3>
  8. <DatePicker
  9. showTime={{ defaultValue: moment("12:12:12", "HH:mm:ss") }}
  10. onChange={(a, b) => console.log(a, b)}
  11. />
  12. <h3>普通的区间选择(每次选择会重置时间为 00:00:00 )</h3>
  13. <RangePicker showTime onChange={(a, b) => console.log(a, b)} />
  14. <h3>设置时间初值的区间选择(每次选择重置时间为用户预设的日期初值 )</h3>
  15. <RangePicker
  16. showTime={{
  17. defaultValue: [
  18. moment("00:00:00", "HH:mm:ss"),
  19. moment("23:59:59", "HH:mm:ss")
  20. ]
  21. }}
  22. onChange={(a, b) => console.log(a, b)}
  23. />
  24. <h3>每次记住上次选择时间的区间选择(每次选择不重置时间)</h3>
  25. <RangePicker
  26. showTime
  27. onChange={(a, b) => console.log(a, b)}
  28. resetTime={false}
  29. />
  30. <h3>设置时间初值的区间选择(每次选择会记住上次选择的时间 )</h3>
  31. <RangePicker
  32. showTime={{
  33. defaultValue: [
  34. moment("00:00:00", "HH:mm:ss"),
  35. moment("23:59:59", "HH:mm:ss")
  36. ]
  37. }}
  38. onChange={(a, b) => console.log(a, b)}
  39. resetTime={false}
  40. />
  41. </div>,
  42. mountNode
  43. );

不同尺寸

三种大小的输入框,大的用在表单中,中的为默认。

DatePicker 日期选择框 - 图12

查看源码在线预览

  1. import { DatePicker } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div>
  4. <h3>大号</h3>
  5. <DatePicker size="large" />
  6. <h3>中号</h3>
  7. <DatePicker />
  8. <h3>小号</h3>
  9. <DatePicker size="small" />
  10. </div>,
  11. mountNode
  12. );

相关区块

DatePicker 日期选择框 - 图13

暂无相关区块