2016-03-31 09:40:55 +08:00
|
|
|
---
|
2019-12-11 23:32:19 +08:00
|
|
|
order: 99
|
2016-09-08 14:09:36 +08:00
|
|
|
title:
|
2016-11-11 12:08:18 +08:00
|
|
|
zh-CN: 自定义日期范围选择
|
|
|
|
en-US: Customized Range Picker
|
2019-12-11 23:32:19 +08:00
|
|
|
debug: true
|
2016-03-31 09:40:55 +08:00
|
|
|
---
|
2015-10-22 17:27:53 +08:00
|
|
|
|
2016-06-19 11:17:09 +08:00
|
|
|
## zh-CN
|
|
|
|
|
2016-11-11 12:08:18 +08:00
|
|
|
当 `RangePicker` 无法满足业务需求时,可以使用两个 `DatePicker` 实现类似的功能。
|
2019-05-07 14:57:32 +08:00
|
|
|
|
|
|
|
> - 通过设置 `disabledDate` 方法,来约束开始和结束日期。
|
|
|
|
> - 通过 `open` `onOpenChange` 来优化交互。
|
2015-10-22 17:27:53 +08:00
|
|
|
|
2016-06-19 11:17:09 +08:00
|
|
|
## en-US
|
|
|
|
|
2017-12-06 09:35:34 +08:00
|
|
|
When `RangePicker` does not satisfied your requirements, try to implement similar functionality with two `DatePicker`.
|
2016-06-19 11:17:09 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
> - Use the `disabledDate` property to limit the start and end dates.
|
|
|
|
> - Improve user experience with `open` and `onOpenChange`.
|
|
|
|
|
|
|
|
```jsx
|
2015-12-10 16:12:10 +08:00
|
|
|
import { DatePicker } from 'antd';
|
2015-10-22 17:27:53 +08:00
|
|
|
|
2016-11-11 12:08:18 +08:00
|
|
|
class DateRange extends React.Component {
|
|
|
|
state = {
|
|
|
|
startValue: null,
|
|
|
|
endValue: null,
|
|
|
|
endOpen: false,
|
|
|
|
};
|
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
disabledStartDate = startValue => {
|
2019-06-19 19:09:08 +08:00
|
|
|
const { endValue } = this.state;
|
2016-11-11 12:08:18 +08:00
|
|
|
if (!startValue || !endValue) {
|
2015-10-22 17:27:53 +08:00
|
|
|
return false;
|
|
|
|
}
|
2016-11-11 12:08:18 +08:00
|
|
|
return startValue.valueOf() > endValue.valueOf();
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
disabledEndDate = endValue => {
|
2019-06-19 19:09:08 +08:00
|
|
|
const { startValue } = this.state;
|
2016-11-11 12:08:18 +08:00
|
|
|
if (!endValue || !startValue) {
|
2015-10-28 18:35:56 +08:00
|
|
|
return false;
|
|
|
|
}
|
2018-01-30 16:00:49 +08:00
|
|
|
return endValue.valueOf() <= startValue.valueOf();
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
|
|
|
onChange = (field, value) => {
|
2015-10-22 17:27:53 +08:00
|
|
|
this.setState({
|
|
|
|
[field]: value,
|
|
|
|
});
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
onStartChange = value => {
|
2016-03-30 17:06:19 +08:00
|
|
|
this.onChange('startValue', value);
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
onEndChange = value => {
|
2016-03-30 17:06:19 +08:00
|
|
|
this.onChange('endValue', value);
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
handleStartOpenChange = open => {
|
2016-06-15 17:46:25 +08:00
|
|
|
if (!open) {
|
|
|
|
this.setState({ endOpen: true });
|
|
|
|
}
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2019-05-07 14:57:32 +08:00
|
|
|
handleEndOpenChange = open => {
|
2016-06-15 17:46:25 +08:00
|
|
|
this.setState({ endOpen: open });
|
2019-05-07 14:57:32 +08:00
|
|
|
};
|
2016-11-11 12:08:18 +08:00
|
|
|
|
2015-10-22 17:27:53 +08:00
|
|
|
render() {
|
2016-11-11 12:08:18 +08:00
|
|
|
const { startValue, endValue, endOpen } = this.state;
|
2016-01-07 16:29:12 +08:00
|
|
|
return (
|
|
|
|
<div>
|
2016-06-15 17:46:25 +08:00
|
|
|
<DatePicker
|
|
|
|
disabledDate={this.disabledStartDate}
|
2016-09-09 13:55:21 +08:00
|
|
|
showTime
|
|
|
|
format="YYYY-MM-DD HH:mm:ss"
|
2016-11-11 12:08:18 +08:00
|
|
|
value={startValue}
|
2016-09-29 14:35:33 +08:00
|
|
|
placeholder="Start"
|
2016-06-06 13:54:10 +08:00
|
|
|
onChange={this.onStartChange}
|
2016-09-27 13:42:30 +08:00
|
|
|
onOpenChange={this.handleStartOpenChange}
|
2016-06-06 13:54:10 +08:00
|
|
|
/>
|
2016-06-15 17:46:25 +08:00
|
|
|
<DatePicker
|
|
|
|
disabledDate={this.disabledEndDate}
|
2016-09-09 13:55:21 +08:00
|
|
|
showTime
|
|
|
|
format="YYYY-MM-DD HH:mm:ss"
|
2016-11-11 12:08:18 +08:00
|
|
|
value={endValue}
|
2016-09-29 14:35:33 +08:00
|
|
|
placeholder="End"
|
2016-06-06 13:54:10 +08:00
|
|
|
onChange={this.onEndChange}
|
2016-11-11 12:08:18 +08:00
|
|
|
open={endOpen}
|
2016-09-27 13:42:30 +08:00
|
|
|
onOpenChange={this.handleEndOpenChange}
|
2016-06-06 13:54:10 +08:00
|
|
|
/>
|
2016-01-07 16:29:12 +08:00
|
|
|
</div>
|
|
|
|
);
|
2016-11-11 12:08:18 +08:00
|
|
|
}
|
|
|
|
}
|
2015-10-22 17:27:53 +08:00
|
|
|
|
2016-11-11 12:08:18 +08:00
|
|
|
ReactDOM.render(<DateRange />, mountNode);
|
2019-05-07 14:57:32 +08:00
|
|
|
```
|