背景
在使用Vue3做日期选择时,为了防止多选,需要对日期控件进行限制,如何试下,记录下来,方便备查。
实现方案
置灰实现
element-plus 使用的
【:disabled-date="disabledDate"】
java
<div class="block">
<span class="demonstration">请选择开始日期</span>
<el-date-picker
v-model="value2"
type="date"
placeholder="开始日期"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
:size="size"
/>
</div>
设置日期
1、今天之后置灰
将今日后置灰,可使用函数【Date.now()】,获取今日的日期。
java
// 函数
const disabledDate = (time: Date) => {
return time.getTime() > Date.now()
}
实现效果如下所示。

2、明天之后置灰
获取明天,可使用【今日+1】,先获取今日的时分秒,通过【getTime】函数来实现。
变量endDate,最后的【+1】是距离今天+1,即明天。
java
// 函数
const disabledDate = (time: Date) => {
const endDate = new Date(new Date().toLocaleDateString()).getTime() + 24*60*60*1000+1
return time.getTime() > endDate
}
实现效果如下所示。

案例代码
java
<template>
<el-radio-group v-model="size" aria-label="size control" class="mb-4">
<el-radio-button value="large">large</el-radio-button>
<el-radio-button value="default">default</el-radio-button>
<el-radio-button value="small">small</el-radio-button>
</el-radio-group>
<div class="demo-date-picker">
<div class="block">
<span class="demonstration">请选择开始日期</span>
<el-date-picker
v-model="value2"
type="date"
placeholder="开始日期"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
:size="size"
/>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const size = ref<'default' | 'large' | 'small'>('default')
const value1 = ref('')
const value2 = ref('')
const shortcuts = [
{
text: 'Today',
value: new Date(),
},
{
text: 'Yesterday',
value: () => {
const date = new Date()
date.setTime(date.getTime() - 3600 * 1000 * 24)
return date
},
},
{
text: 'A week ago',
value: () => {
const date = new Date()
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
return date
},
},
]
const disabledDate = (time: Date) => {
const endDate = new Date(new Date().toLocaleDateString()).getTime() + 24*60*60*1000+1
return time.getTime() > endDate
}
</script>
<style scoped>
.demo-date-picker {
display: flex;
width: 100%;
padding: 0;
flex-wrap: wrap;
}
.demo-date-picker .block {
padding: 1.5rem 0;
text-align: center;
border-right: solid 1px var(--el-border-color);
flex: 1;
min-width: 300px;
}
.demo-date-picker .block:last-child {
border-right: none;
}
.demo-date-picker .demonstration {
display: block;
color: var(--el-text-color-secondary);
font-size: 14px;
margin-bottom: 1rem;
}
@media screen and (max-width: 768px) {
.demo-date-picker .block {
flex: 0 0 100%;
padding: 1rem 0;
min-width: auto;
border-right: none;
border-bottom: solid 1px var(--el-border-color);
}
.demo-date-picker .block:last-child {
border-bottom: none;
}
}
</style>