【问题标题】:antd DatePicker: Disable minutes only for given hourantd DatePicker:仅在给定小时内禁用分钟
【发布时间】:2018-03-06 16:18:43
【问题描述】:

我正在使用来自 antd 的DatePicker

<LocaleProvider locale={enUS}>
    <DatePicker
      format="MM/D/YYYY HH:mm"
      defaultValue={this.getStartValue()}
      showTime={{format: 'HH:mm'}}
      placeholder="Start"
      allowClear={false}
      onOk={this.onStartTimeChange}
    />
</LocaleProvider>
<LocaleProvider locale={enUS}>
    <DatePicker
      format="MM/DD/YYYY HH:mm"
      defaultValue={this.getEndValue()}
      showTime={{format: 'HH:mm'}}
      placeholder="End"
      allowClear={false}
      onOk={this.onEndTimeChange}
    />
</LocaleProvider>

这里的要求是:

  • 对于 startDate,应禁用超出结束日期的日期,也应禁用超出结束时间的时间。

我已经使用 disabledDate 实现了禁用日期。

现在我正在尝试使用 disabledTime 道具,但无法理解如何仅在给定小时内禁用分钟

例如 如果结束时间:18:34 然后应该启用从 00:00 到 18:33 的所有时间,并且应该禁用从 18:34 到 23:59 的所有时间。

================================

getDateTime(value) {
    const dateTime = {};
    dateTime.date = value.format('MM/DD/YYYY');
    dateTime.hour = value.hour();
    dateTime.minute = value.minute();
    return dateTime;
}

getDisplayTime(dateTime) {
    const date = dateTime.date;
    const hour = dateTime.hour;
    const minute = dateTime.minute;
    const timeStr = `${date} ${hour}:${minute}`;
    return moment(timeStr, 'MM/DD/YYYY HH:mm');
}

onStartTimeChange(value) {
    if (value) {
        this.props.updateStartTime(this.getDateTime(value));
    }
}

onEndTimeChange(value) {
    if (value) {
        this.props.updateEndTime(this.getDateTime(value));
    }
}

getStartValue() {
    return this.getDisplayTime(this.props.startTime);
}

getEndValue() {
    return this.getDisplayTime(this.props.endTime);
}

disabledStartDate(current) {
    // Can not select days after end date
    const endDate = this.getEndValue();
    return current && endDate && current.valueOf() > endDate.valueOf();
}

range(start, end) {
    const result = [];
    for (let i = start; i < end; i++) {
        result.push(i);
    }
    return result;
}

disabledStartDateTime(current) {
    const endDate = this.getEndValue();
    if (current && endDate && current.valueOf() !== endDate.valueOf()) {
        return {};
    }
    const hour = current.hour();
    const minute = current.minute();
    return {
        disabledHours: () => {
            if (hour < 23) {
                let start = hour;
                if (minute !== 0) {
                    start += 1;
                }
                return this.range(start, 24);
            }
            return [];
        },
        disabledMinutes: () => {
            if (current.hour() === hour) {
                return this.range(minute, 60);
            }
            return [];
        }
    };
}

<LocaleProvider locale={enUS}>
    <DatePicker
      format='MM/DD/YYYY HH:mm'
      defaultValue={this.getStartValue()}
      showTime={{format: 'HH:mm'}}
      allowClear={false}
      showToday={false}
      disabledDate={this.disabledStartDate}
      disabledTime={this.disabledFromDateTime}
      hideDisabledOptions={true}
      onChange={this.onStartTimeChange}
    />
</LocaleProvider>

<LocaleProvider locale={enUS}>
    <DatePicker
      format='MM/DD/YYYY HH:mm'
      defaultValue={this.getEndValue()}
      showTime={{format: 'HH:mm'}}
      allowClear={false}
      showToday={false}
      hideDisabledOptions={true}
      onChange={this.onEndTimeChange}
    />
</LocaleProvider>

================================

【问题讨论】:

    标签: reactjs react-redux antd


    【解决方案1】:

    &lt;DatePicker ... showTime={{ format: "...", disabledMinutes: this.disabledMinutes}} /&gt;

    然后

    disabledMinutes = ( hour ) => {
        let minutes = []
        // Check which minutes 0..59 should be disabled during this hour
        // and push each minute to the minutes array. 
        return minutes
    }
    

    【讨论】:

    • 这不起作用。基本上 ok 按钮即将被禁用,但正在使用更改,并且只要用户及时单击任何位置,这些值就会显示为可选(并且触发 onChange)。我需要更改,以便我可以处理用户手动编辑输入字段的情况。
    • 显示您的代码,否则很难进一步提供帮助。我在上面发布的内容与任何确定按钮无关。
    • 对不起,我用TimePicker给了你答案。当您使用嵌入在 DatePicker 中的 TimePicker 时,您需要在 showTime={...} 参数中传递选项。答案已更新。
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多