在许多子表的应用场景下 会产生时间选择不允许出现重叠的情况,可以使用如下方法
目前应用场景
html代码如下
<a-table
:columns="columns"
bordered
:data-source="Datasource"
size="small"
class="components-table-demo-nested"
>
<template #bodyCell="{ column, record, index }">
<div class="item" v-if="column.dataIndex == 'startDate'">
<a-date-picker
v-model:value="record.startDate"
:valueFormat="'YYYY-MM-DD'"
:disabledDate="disabledStartDate"
></a-date-picker>
</div>
<div class="item" v-if="column.dataIndex == 'endDate'">
<a-date-picker
v-model:value="record.endDate"
:valueFormat="'YYYY-MM-DD'"
:disabledDate="(current) => disabledEndDate(current, record)"
></a-date-picker>
</div>
<template/>
<a-table/>
js 代码
<script setup>
import {ref} from "vue"
const columns = ref([
{ title: '开始时间', dataIndex: 'startDate', key: 'startDate', align: 'center', width: '25%' },
{ title: '结束时间', dataIndex: 'endDate', key: 'endDate', align: 'center', width: '25%' },
]);
const Datasource = ref([])
// 时间对比
// current 时间戳 , disabledDateList 数组数据, rowsStartDate 行开始时间 结束时间禁用
const disDate = (current, disabledDateList, rowsStartDate = null) => {
let type = false;
let date = new Date(current);
let c = new Date(`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`).getTime();
for (let i = 0; i < disabledDateList.length; i++) {
// 新增的空数据过滤 减少资源损耗
if (!disabledDateList[i].startDate && !disabledDateList[i].endDate) {
break;
}
let startDate = new Date(disabledDateList[i].startDate).getTime() - 28800000;
let endDate = new Date(disabledDateList[i].endDate).getTime();
let recordStartDate = rowsStartDate ? new Date(rowsStartDate).getTime() : '';
if (recordStartDate) {
// 禁用所有小于行开始的时间 禁用所有 开始时间大于 行时间 的数据
if (c <= recordStartDate || (startDate > recordStartDate && c > startDate)) {
type = true;
break;
}
} else {
// 禁用 多个时间段
if (c <= endDate && c >= startDate) {
type = true;
break;
}
}
}
return type;
};
// 开始时间禁用逻辑
const disabledStartDate = (current) => {
let date = new Date(current).getTime();
let tarDate = new Date().getTime();
return Datasource.value.length == 1
? current && date < tarDate
: (current && date < tarDate) || disDate(current, Datasource.value);
};
// 结束时间禁用逻辑
const disabledEndDate = (current, record) => {
let date = new Date(current).getTime();
return (
current &&
(record.startDate
? date < new Date(record.startDate).getTime() ||
disDate(current, Datasource.value, record.startDate)
: true)
);
};
<script/>