假如现在有一个需求,你是一个公司的助理,在老板的日程表里,['09:00,''09:30',‘10:00’...‘11:30’]这些时间是可以接待客户的,其他时间已经满接待了,你在帮老板安排排程的时候,有这样的操作界面:
选择了日期后,再选择时间
首先,你需要根据日期去后端查出老板的排程表,假如得到如下结果:
const [availableTimes, setAvailableTimes] = useState<string[]>(['01:00','01:30','02:30','11:30','12:00','18:00','19:30']);
为了避免重复排程,当你选择2点的时候,从availableTimes可以看出2点00分的选项是已经有安排的,应该禁用。那么,如何动态的根据选择的小时去禁用分钟的选项呢?直接上代码:
<TimePicker
showNow={false}
disabledTime={disabledTime}
style={{ width: '100%' }}
minuteStep={30}
// hideDisabledOptions
onChange={handleDatePickerChange}
format={EUDateType.Minute}
/>
// 返回小时,分钟,秒的中间的所有位数
const range = (start, end) => {
const result: any[] = [];
for (let i: number = start; i < end; i++) {
result.push(i);
}
return result;
};
/**
* 根据后端返回可选的时间,反向禁用不可选的时间
* @returns
*/
const disabledTime: any = () => {
const nowHour = new Date().getHours();
const nowMinute = new Date().getMinutes();
const now = moment();
const nowTime = `${nowHour.toString().padStart(2, '0')}:${nowMinute
.toString()
.padStart(2, '0')}`;
return {
disabledHours: () =>
moment(selectedBusinessDate).isSame(now, 'day') ? range(0, nowHour) : range(-1, -1),
disabledMinutes: (selectedHour: number) => {
console.log(selectedHour, 'selectedHour');
// 如果选择的小时不在可选时间范围内,则禁用所有分钟和秒钟
if (!availableTimes.some(time => parseInt(time.slice(0, 2)) == selectedHour)) {
console.log('不在可选时间范围内');
return range(0, 59);
}
// 如果选择的小时在可选时间范围内,则禁用不在可选时间范围内的分钟
console.log('在可选时间范围内');
const disabledMinutes = Array.from({ length: 60 }, (_, i) => i).filter(
minute =>
!availableTimes.includes(
`${selectedHour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`
) ||
(minute !== 0 && minute !== 30)
);
// 比如现在18:18分,不在18:00后端列表里,但是,交互上需要实现禁用18:00的选项
if (selectedHour === nowHour && !availableTimes.includes(nowTime)) {
return [...disabledMinutes, ...range(0, nowMinute)];
}
return [...disabledMinutes];
},
// 秒钟全部禁用
disabledSeconds: () => [0, 59]
};
};