# zx-date-picker 日期选择器

基于 Element Plus 设计的日期选择器组件，适用于 uni-app 项目，支持多种日期选择模式。

## 功能特性

- ✅ 支持单个日期、日期时间、月份、年份选择
- ✅ 支持日期范围、日期时间范围选择
- ✅ 支持快捷选项配置
- ✅ 支持自定义格式化
- ✅ 支持禁用特定日期
- ✅ 支持默认值设置
- ✅ 响应式设计，适配移动端
- ✅ 完整的事件系统
- ✅ TypeScript 类型支持

## 基础用法

```vue
<template>
  <zx-date-picker 
    v-model="date" 
    placeholder="请选择日期"
    @change="handleChange"
  />
</template>

<script setup>
import { ref } from 'vue';

const date = ref('');

const handleChange = (value) => {
  console.log('选择的日期：', value);
};
</script>
```

## 组件属性

| 属性名 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| modelValue / v-model | String / Array / Date | '' | 绑定值 |
| type | String | 'date' | 显示类型，可选值：year/month/date/datetime/daterange/datetimerange |
| placeholder | String | '' | 输入框占位文本 |
| startPlaceholder | String | '开始日期' | 范围选择时开始日期的占位内容 |
| endPlaceholder | String | '结束日期' | 范围选择时结束日期的占位内容 |
| format | String | '' | 显示在输入框中的格式 |
| valueFormat | String | '' | 可选，绑定值的格式 |
| readonly | Boolean | false | 完全只读 |
| disabled | Boolean | false | 禁用 |
| size | String | 'default' | 输入框尺寸，可选值：large/default/small |
| clearable | Boolean | true | 是否显示清除按钮 |
| className | String | '' | 输入框的类名 |
| name | String | '' | 原生属性 |
| prefixIcon | String | '' | 自定义前缀图标 |
| suffixIcon | String | 'zx-icon-calendar' | 自定义后缀图标 |
| clearIcon | String | 'zx-icon-close-circle' | 自定义清空图标 |
| validateEvent | Boolean | true | 是否触发表单验证 |
| disabledDate | Function | null | 设置禁用状态，参数为当前日期，要求返回 Boolean |
| shortcuts | Array | [] | 设置快捷选项 |
| cellClassName | Function | null | 设置日期单元格的类名 |
| rangeSeparator | String | ' 至 ' | 选择范围时的分隔符 |
| defaultValue | String / Date / Array | null | 可选，选择器打开时默认显示的时间 |
| defaultTime | String / Array | null | 选中日期后的默认具体时刻 |
| cancelText | String | '取消' | 取消按钮文字 |
| confirmText | String | '确认' | 确认按钮文字 |
| title | String | '选择日期' | 弹窗标题 |
| popupHeight | Number | 500 | 弹窗高度 |
| showSeconds | Boolean | false | 是否显示秒 |
| unlinkPanels | Boolean | false | 在范围选择器里取消两个日期面板之间的联动 |

## 组件事件

| 事件名 | 说明 | 回调参数 |
| --- | --- | --- |
| change | 用户确认选定的值时触发 | 组件绑定值 |
| blur | 当 input 失去焦点时触发 | - |
| focus | 当 input 获得焦点时触发 | - |
| clear | 可清空的模式下用户点击清空按钮时触发 | - |
| calendar-change | 在日历所选日期更改时触发 | [Date, Date] |
| panel-change | 当日期面板改变时触发 | { panel, type, direction } |
| visible-change | 当 DatePicker 的下拉列表出现/消失时触发 | 出现则为 true，隐藏则为 false |

## 组件方法

| 方法名 | 说明 | 参数 |
| --- | --- | --- |
| focus | 使 input 获取焦点 | - |
| blur | 使 input 失去焦点 | - |
| handleOpen | 打开日期选择器弹窗 | - |
| handleClose | 关闭日期选择器弹窗 | - |

## 格式化

使用 `format` 指定输入框的格式；使用 `value-format` 指定绑定值的格式。

默认情况下，组件接受并返回 `Date` 对象。

| 格式 | 含义 | 备注 | 举例 |
| --- | --- | --- | --- |
| YYYY | 年 | | 2025 |
| MM | 月 | | 01-12 |
| DD | 日 | | 01-31 |
| HH | 小时 | 24小时制 | 00-23 |
| mm | 分钟 | | 00-59 |
| ss | 秒 | | 00-59 |

## 使用示例

### 选择日期时间

```vue
<zx-date-picker 
  v-model="datetime"
  type="datetime"
  placeholder="选择日期时间"
  format="YYYY-MM-DD HH:mm:ss"
/>
```

### 选择日期范围

```vue
<zx-date-picker 
  v-model="daterange"
  type="daterange"
  range-separator=" 至 "
  start-placeholder="开始日期"
  end-placeholder="结束日期"
/>
```

### 带快捷选项

```vue
<zx-date-picker 
  v-model="value"
  type="daterange"
  :shortcuts="shortcuts"
/>

<script setup>
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const end = new Date();
      const start = new Date();
      start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
      return [start, end];
    }
  }
];
</script>
```

### 设置禁用日期

```vue
<zx-date-picker 
  v-model="value"
  :disabled-date="disabledDate"
/>

<script setup>
const disabledDate = (time) => {
  return time.getTime() > Date.now();
};
</script>
```

## 注意事项

1. 在 uni-app 中使用时，请确保项目支持 Vue 3 和 Composition API
2. 组件使用了 `picker-view` 原生组件，在某些平台上可能有样式限制
3. 图标字体需要在项目中引入对应的字体文件
4. 日期格式化功能较为基础，如需复杂格式化建议使用第三方库

## 更新日志

### v1.0.0
- 初始版本
- 支持基础日期选择功能
- 支持日期范围选择
- 支持快捷选项配置
- 支持自定义格式化
- 支持禁用日期功能
