# cxc-szcx-dateRangeSelect
# # 紧凑型日期时间选择器组件说明书
## 一、组件概述
`compact-datetime-picker` 是一个基于 Vue 开发的紧凑型日期时间选择器组件,用于在页面中选择日期范围。组件提供了自然周期和相对周期两种选择模式,并且支持快捷选择本周、本月、本季、本年、近一周、近一月、近一季、近一年等常见时间范围。
## 二、组件依赖
- **Vue**:组件基于 Vue 框架开发。
- **uni-popup**:来自 `uni-app` 的弹窗组件,用于显示日期选择器的弹出层。
## 三、组件使用方法
### 1. 引入组件
在需要使用该组件的 Vue 文件中,引入 `compact-datetime-picker` 组件。
```vue
```
### 2. 组件属性
| 属性名 | 类型 | 默认值 | 描述 |
| ---- | ---- | ---- | ---- |
| `modelValue` | `Array` | `[null, null]` | 双向绑定的日期范围数组,第一个元素为开始日期,第二个元素为结束日期。 |
## 四、组件内部实现
### 1. 模板部分
- **输入框区域**:显示开始日期和结束日期的输入框,点击输入框可打开日期选择弹窗。
- **日期选择弹窗**:
- **快捷按钮区域**:包含自然周期和相对周期的切换按钮,以及不同模式下的快捷操作按钮。
- **日历选择区域**:显示当前月份的日历,可选择日期。
- **操作按钮**:包含取消和确定按钮,用于关闭弹窗和确认选择的日期范围。
### 2. 脚本部分
#### 2.1 数据属性
```javascript
data() {
return {
isNatural: true, // 是否为自然周期模式
activeType: 'start', // 当前活跃的日期选择类型(开始或结束)
currentMonth: new Date(), // 当前显示的月份
tempStart: null, // 临时开始日期
tempEnd: null, // 临时结束日期
weekDays: ['日', '一', '二', '三', '四', '五', '六'], // 星期几的显示文本
quickButtonszr: [
{ label: '本周', type: 'week' },
{ label: '本月', type: 'month' },
{ label: '本季', type: 'quarter' },
{ label: '本年', type: 'year' }
], // 自然周期模式下的快捷按钮
quickButtonsxd: [
{ label: '近一周', type: 'week' },
{ label: '近一月', type: 'month' },
{ label: '近一季', type: 'quarter' },
{ label: '近一年', type: 'year' }
] // 相对周期模式下的快捷按钮
};
}
```
#### 2.2 计算属性
- `formattedStart`:格式化后的开始日期。
- `formattedEnd`:格式化后的结束日期。
- `calendarDays`:生成当前月份的日历数据。
- `monthText`:当前月份的显示文本。
#### 2.3 监听属性
```javascript
watch: {
modelValue: {
immediate: true,
handler(newVal) {
this.tempStart = newVal[0];
this.tempEnd = newVal[1];
}
}
}
```
监听 `modelValue` 的变化,初始化临时日期。
#### 2.4 方法
- **打开弹窗并初始化临时值**:`openPicker(type)`,打开日期选择弹窗,并根据活跃类型初始化临时日期。
- **日期点击处理**:`handleDayClick(day)`,处理日期点击事件,更新临时开始或结束日期。
- **确认选择**:`confirmSelection()`,确认选择的日期范围,触发 `update:modelValue` 事件并关闭弹窗。
- **关闭弹窗**:`closePicker()`,关闭日期选择弹窗,并重置临时日期。
- **重置临时日期**:`resetTempDates()`,将临时日期重置为当前的 `modelValue`。
- **生成日历数据**:`generateCalendar(date)`,根据给定的月份生成日历数据。
- **日期选择处理**:`selectDate(date)`,处理日期选择,更新 `modelValue`。
- **切换月份**:`changeMonth(offset)`,切换当前显示的月份。
- **判断日期状态**:
- `isSelected(date)`:判断日期是否被选中。
- `isEnd(date)`:判断日期是否为结束日期。
- `isToday(date)`:判断日期是否为今天。
- `isStart(date)`:判断日期是否为开始日期。
- `isInRange(date)`:判断日期是否在选择的范围内。
- `isSameDay(d1, d2)`:判断两个日期是否为同一天。
- **快捷范围设置**:`setQuickRange(type)`,根据快捷按钮的类型设置日期范围,并关闭弹窗。
- **自然周期计算**:`calcNaturalRange(type, currentDate)`,计算自然周期模式下的日期范围。
- **相对周期计算**:`calcRelativeRange(type, currentDate)`,计算相对周期模式下的日期范围。
- **周计算(周一为起点)**:
- `getWeekStart(date)`:获取一周的开始日期。
- `getWeekEnd(startDate)`:获取一周的结束日期。
- **月末处理**:`lastDayOfMonth(date)`,获取给定月份的最后一天。
- **月末日调整**:`adjustMonthEnd(start, end)`,调整开始日期到合适的月末日期。
- **闰年判断**:`isLeapYear(year)`,判断给定年份是否为闰年。
- **模式切换**:`toggleMode(isNatural)`,切换自然周期和相对周期模式。
- **日期格式化**:`formatDate(date)`,将日期格式化为 `YYYY-MM-DD` 的字符串。
### 3. 样式部分
- **输入框区域**:设置输入框的样式,包括边框、背景色、字体大小等。
- **紧凑弹窗**:设置弹窗的整体样式,包括背景色、边框半径等。
- **紧凑头部**:设置月份标题和导航箭头的样式。
- **紧凑日期网格**:设置星期几和日期的显示样式,以及不同状态下的日期背景色和字体颜色。
- **快捷按钮区域**:设置模式切换按钮和快捷操作按钮的样式。
- **底部操作**:设置取消和确定按钮的样式。
## 五、注意事项
- 组件使用了 `uni-popup` 组件,确保项目中已正确引入和配置。
- 日期范围的选择逻辑较为复杂,特别是在自然周期和相对周期的切换以及快捷范围设置时,需注意日期的计算和显示。
- 组件的样式是基于 `scoped` 作用域的,可根据项目需求进行调整和扩展。