首先来看一下官方的DatePicker,接下来就以下面的效果,来逐步实现一下日期范围限定。在这里简单的分两种情况:1、单日期表,单日期选择的日期限定;2、多日期表,时间范围选择的日期限定。

1、 单日期表,单日期选择的日期限定
首先把界面搭建一下(elementUI),官方地址:https://element.eleme.cn/#/zh-CN/component/date-picker

<div class="block">
<el-date-picker
v-model="startDate"
type="date" placeholder="日期选择"
style="width:100%;max-width: 300px"
format="yyyy-MM-dd"
:picker-options="pickerOptionsStart"
>
</el-date-picker>
element的日期范围限定主要是通过Picker Options的disabledDate ,因此在界面上要先绑定picker-options,然后直接在data里面限定日期,绑定的值可以像函数那样,对日期进行各种各样的操作。
export default {
return{
startDate:'',
pickerOptionsStart:{
disabledDate:(tiem) =>{
// console.log(time); // 这里的参数和函数一样可以被打印出来
// console.log(time.getTime());
const month = 30*24*60*60*1000 // 限定一个日期范围,这里是30天
return time.getTime() < new Date() || time.getTime() > new Date().getTime() + month // 直接return需要禁止的选择的日期,即当前日期~30天后的日期可选择外,其他的全部禁止
}
}
}
}

2、 多日期表,多日期选择的日期限定

<div class="block">
<el-date-picker
v-model="deskDate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width:100%;max-width: 300px"
value-format="yyyy-MM-dd"
:picker-options="pickeroptions"
>
</el-date-picker>
</div>(1)多日期范围的选择可以和单日选择一样,在disabledDate 中直接return
export default {
return{
deskDate:'',
pickeroptions:{
disableDate:(tiem) =>{
// console.log(time); // 这里的参数和函数一样可以被打印出来
// console.log(time.getTime());
const month = 30*24*60*60*1000 // 限定一个日期范围,这里是30天
return time.getTime() < new Date() || time.getTime() > new Date().getTime() + month // 直接return需要禁止的选择的日期,即当前日期~30天后的日期可选择外,其他的全部禁止
}
}
}
} 
(2)也可以在选择日期的时候再做日期限定
pickeroptions:{
// onPick:是选中日期时的回调函数,可以在这里对选中的日期进行处{maxDate:后选中日期;minDate:第一个选中的日期}
onPick:({maxDate,minDate}) =>{
this.startDate = minDate && minDate.getTime();
if (maxDate) {
// 选中后一个时,要把第一个的赋值清空
this.startDate = ''
}
},disabledDate:(time) =>{
const month = 30*24*60*60*1000 // 设定日期范围
const minTime = this.startDate - month
const maxTime = this.startDate + month
if(this.startDate){
// 选中第一个时,前后30天[-30,30]共60天可选选择,超出的不可选,这里的天数按自己喜欢设定
return time.getTime() < minTime || time.getTime() > maxTime
}
// 不选任何日期执行下面的代码
// return time.getTime() > Date.now()
}

【2021-7-28更新以下内容】
当然,月份和年份的限制也可以用天数的思想来处理 ,比如月份要求是半年,那就用【180】天这样来计算,再比如年份,就用【365】天这样计算,如果想精确计算天数咋办~~~
3、精确计算日期不能超过某范围
/**
* 日期不能超出某范围
*
* @param start 开始日期 格式为:'2021-01-25'(string)
* @param end 结束日期 格式为:'2021-01-25'(string)
* @param range 范围 格式为:3(number)
*/
function beyondDate(start,end,range) {
let startArr = start.split('-');
let endArr = end.split('-');
let flag = true;
startArr[1] = parseInt(startArr[1]);
startArr[2] = parseInt(startArr[2]);
endArr[1] = parseInt(endArr[1]);
endArr[2] = parseInt(endArr[2]);
// 同年
if (startArr[0]===endArr[0]){
// 月间隔超出范围,直接返回false
if (endArr[1]- startArr[1] > range){
flag = false
} else if (endArr[1]-startArr[1] === range){
// 月间隔没超出范围,比较日
if (endArr[2] > startArr[2]){
flag = false
}
}
return flag
}
// 不同年
else {
if (endArr[0] - startArr[0] > 1){
flag = false
}else if (endArr[0] - startArr[0] === 1){
// 开始年分小于10时,不需要跨年
if (startArr[1] < 10){
flag = false
} else if (startArr[1] + range -endArr[1] <12){
// 月间隔超出范围
flag = false
} else if (startArr[1] + range -endArr[1] === 12){
// 月间隔没超出范围,比较日
if (endArr[2] > startArr[2]){
flag = false
}
}
}
return flag
}
}
let a = beyondDate(start,end,3)
console.log(a);以上就是【elementUI】DatePicker时间选择器范围限定的基本思路,不管是单日期,还是多日期的选择,其目的都是为了更好的用户体验。
版权声明:本文为weixin_45785873原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。