以下是实现您需求的完整解决方案,包括默认日期范围赋值、日期选择器限制等逻辑。
### 回答问题
1. **开始时间为今天向前一个自然月的第一天**:通过 `getFirstDayOfPreviousMonth` 方法计算出上个月的第一天。
2. **结束时间为今天**:直接使用当前日期作为结束时间。
3. **开始时间选择和结束时间选择区间最大1个月**:通过 `pickerOptions` 的 `disabledDate` 和 `onPick` 方法限制日期范围。
4. **给 `dateRange` 一个初始值**:在初始化时调用 `initDateRange` 方法设置默认日期范围。
以下是完整的代码实现:
```vue
<script setup>
import { ref, reactive, onMounted } from "vue";
import DtToolbarBox from '../../components/layout/DtToolbarBox.vue';
// 获取全局属性
const { proxy } = getCurrentInstance();
const tableRef = ref(null);
// 定义属性
const datas = reactive({
loading: false,
keyword: '',
totalCount: 0,
pageSize: 10,
pageIndex: 1,
listData: [],
multipleSelection: [],
reportType: -1,
reportStatus: -1,
dateRange: []
});
// 计算自然月的第一天
const getFirstDayOfPreviousMonth = () => {
const today = new Date();
const firstDay = new Date(today.getFullYear(), today.getMonth() - 1, 1);
return proxy.$dayjs(firstDay).format('YYYY-MM-DD');
};
// 初始化日期范围
const initDateRange = () => {
const today = proxy.$dayjs().format('YYYY-MM-DD');
const firstDayPrevMonth = getFirstDayOfPreviousMonth();
datas.dateRange = [firstDayPrevMonth, today];
};
// 日期选择器配置
const pickerOptions = reactive({
disabledDate(time) {
const [start, end] = datas.dateRange;
if (!start) return false;
const maxEndDate = proxy.$dayjs(start).add(1, 'month').toDate();
return time.getTime() > maxEndDate || time.getTime() > Date.now();
},
onPick({ maxDate, minDate }) {
if (maxDate && minDate) {
const diff = proxy.$dayjs(maxDate).diff(minDate, 'month', true);
if (diff >= 1) {
proxy.$nextTick(() => {
datas.dateRange = [
minDate,
proxy.$dayjs(minDate).add(1, 'month').toDate()
];
proxy.$message.warning('时间选择范围不能超过1个月');
});
}
}
}
});
// 修改日期范围时的处理
const handleDateChange = (val) => {
if (!val || val.length !== 2) return;
const [start, end] = val;
const monthDiff = proxy.$dayjs(end).diff(start, 'month', true);
if (monthDiff > 1) {
proxy.$message.warning('时间选择范围不能超过1个月');
initDateRange(); // 重置为默认范围
return;
}
datas.dateRange = val;
initData();
};
// 初始化数据
const initData = async () => {
if (!ValidateDateRange(datas.dateRange)) {
proxy.$message.warning("日期范围不能超过2个月,请重新选择!");
return;
}
let sendUrl = `/vehicleReport/reports?pageSize=${datas.pageSize}&pageIndex=${datas.pageIndex}` +
`&reportType=${datas.reportType}` +
`&reportStatus=${datas.reportStatus}`;
if (datas.dateRange.length > 0) {
sendUrl += `&startTime=${datas.dateRange[0]}`;
sendUrl += `&endTime=${datas.dateRange[1]}`;
}
if (datas.keyword.length > 0) {
sendUrl += `&keyword=${encodeURI(datas.keyword)}`;
}
await proxy.$api.request({
url: sendUrl,
beforeSend() {
datas.loading = true;
},
success(res) {
datas.listData = res.data;
let pageInfo = JSON.parse(res.headers["x-pagination"]);
datas.totalCount = pageInfo.totalCount;
datas.pageSize = pageInfo.pageSize;
datas.pageIndex = pageInfo.pageIndex;
},
error(err) {
datas.listData = [];
},
complete() {
datas.loading = false;
}
});
};
// 页面加载时初始化日期范围
onMounted(() => {
initDateRange();
initData();
});
</script>
<template>
<div class="mainbody">
<!-- 省略其他代码 -->
<el-date-picker
style="width:280px"
v-model="datas.dateRange"
type="daterange"
value-format="YYYY-MM-DD"
start-placeholder="开始时间"
end-placeholder="结束时间"
:picker-options="pickerOptions"
@change="handleDateChange">
</el-date-picker>
<!-- 省略其他代码 -->
</div>
</template>
```
---
### 解释
1. **`getFirstDayOfPreviousMonth`**:
- 计算当前日期的上一个月的第一天,并格式化为 `YYYY-MM-DD` 格式。
2. **`initDateRange`**:
- 设置默认的日期范围,起始时间为上个月的第一天,结束时间为当前日期。
3. **`pickerOptions`**:
- `disabledDate`: 禁止用户选择超出范围的日期。根据已选的起始日期,限制结束日期最多为起始日期后的一个月。
- `onPick`: 当用户选择日期时,动态检查日期范围是否超过一个月。如果超过,则自动调整为允许的最大范围,并提示用户。
4. **`handleDateChange`**:
- 监听日期选择器的 `@change` 事件,确保用户选择的日期范围不超过一个月。如果超出,重置为默认范围并提示。
5. **`onMounted`**:
- 在组件挂载时初始化默认日期范围,并加载数据。
---
###