产品经理一句,结束时间只能选择周五,让一直都只用 elment ui 日期区间,最多增加一个限制最大时间区间的我表示一脸懵逼,你在说啥,我要怎么搞?你不是在玩我吧, 但是作为卑微打工人只能一边掉头发,一边"XX 都是 XX"。

Element UI 日期区间选择器限制结束时间只能选择周五!!!!
功能需求
先拆分下这个需求 实现一个带有特殊限制条件的日期区间选择器:
- 开始时间限制:只能选择今天到三个月内的日期
- 结束时间限制:只能选择周五,且结束时间不能早于开始时间
- 整体时间范围:限制在三个月内
代码实现
基础模板
vue:/Users/hemooo/Documents/code/fubaodai_admin_frontend/src/views/anniversary/carveUp/add.vue
<template>
<el-date-picker
v-model="activityForm.activityPeriod"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions"
style="width: 380px"
>
</el-date-picker>
</template>
核心配置
javascript
data() {
return {
selecting: 'start', // 当前选择状态:start-选择开始时间,end-选择结束时间
minDate: null, // 记录选择的开始时间
pickerOptions: {
firstDayOfWeek: 1,
disabledDate: (time) => {
const today = new Date();
today.setHours(0, 0, 0, 0);
const threeMonthsLater = new Date();
threeMonthsLater.setMonth(threeMonthsLater.getMonth() + 3);
threeMonthsLater.setHours(23, 59, 59, 999);
// 如果是结束时间,只允许选择周五
if (this.selecting === 'end') {
return time.getTime() < today.getTime() ||
time.getTime() > threeMonthsLater.getTime() ||
time.getDay() !== 5 ||
(this.minDate && time.getTime() < this.minDate.getTime());
}
// 开始时间限制
return time.getTime() < today.getTime() ||
time.getTime() > threeMonthsLater.getTime();
},
onPick: ({ minDate, maxDate }) => {
// 根据选择状态切换限制条件
this.selecting = minDate && !maxDate ? 'end' : 'start';
if(minDate && !maxDate) {
this.minDate = minDate;
}
}
}
}
}
实现要点说明
1. 状态管理
selecting
: 用于标记当前是选择开始时间还是结束时间minDate
: 记录已选择的开始时间,用于限制结束时间的选择范围
2. 时间限制逻辑
javascript
// 基础时间范围设置
const today = new Date();
today.setHours(0, 0, 0, 0);
const threeMonthsLater = new Date();
threeMonthsLater.setMonth(threeMonthsLater.getMonth() + 3);
threeMonthsLater.setHours(23, 59, 59, 999);
3. 选择限制条件
- 开始时间限制:
javascript
return time.getTime() < today.getTime() ||
time.getTime() > threeMonthsLater.getTime();
- 结束时间限制:
javascript
return time.getTime() < today.getTime() ||
time.getTime() > threeMonthsLater.getTime() ||
time.getDay() !== 5 ||
(this.minDate && time.getTime() < this.minDate.getTime());
4. 状态切换处理
javascript
onPick: ({ minDate, maxDate }) => {
// 因为如果只有 minDate 没有 maxDate 就表示选择了第一个时间, 在 Element 的文档上没有告诉我如何拿到第一个选择的时间,如果有哪位大神知道告诉下
this.selecting = minDate && !maxDate ? 'end' : 'start';
if(minDate && !maxDate) {
this.minDate = minDate;
}
}
使用注意事项
- 开始时间选择后,结束时间只能选择之后的周五
- 整个时间区间被限制在当前时间的三个月内
- 时间格式统一使用 "yyyy-MM-dd HH:mm:ss"
应用场景
- 活动有效期设置
- 特定日期限制的时间区间选择
- 需要按周几限制的日期选择
这样就是实现了产品经理的XX 需求,打工人好难!!!!!