252962bb
刘淇
uni_modu
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
# neo-datetime-pro
高级日期时间选择器,支持日期/时间/范围选择、快捷选项、禁用规则等功能。
## 特性
- 单日期选择
- 日期范围选择(开始-结束)
- 时间选择(时/分/秒)
- 日期+时间组合选择
- 快捷选项(今天、最近7天、本月等)
- 禁用日期规则(自定义函数、最小/最大日期)
- 周序号显示
- 国际化支持(中文/英文)
- 移动端友好的底部弹出交互
- 全平台兼容
## 兼容性
| Vue2 | Vue3 | H5 | App | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
|------|------|----|----|--------|----------|--------|--------|---------|
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
## 安装
在 HBuilderX 中右键 `uni_modules` 目录,选择 `从插件市场导入`,搜索 `neo-datetime-pro` 安装。
或者直接复制 `neo-datetime-pro` 目录到项目的 `uni_modules` 目录下。
## 快速开始
### 基础用法
```vue
<template>
<neo-datetime-pro
v-model="date"
placeholder="请选择日期"
/>
</template>
<script>
export default {
data() {
return {
date: ''
}
}
}
</script>
```
### 日期范围选择
```vue
<template>
<neo-datetime-pro
v-model="dateRange"
type="daterange"
placeholder="请选择日期范围"
/>
</template>
<script>
export default {
data() {
return {
dateRange: []
}
}
}
</script>
```
### 日期时间选择
```vue
<template>
<neo-datetime-pro
v-model="datetime"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择日期时间"
/>
</template>
<script>
export default {
data() {
return {
datetime: ''
}
}
}
</script>
```
### 时间选择
支持根据 `format` 自动显示时间部分:
```vue
<template>
<!-- 时分秒 -->
<neo-datetime-pro
v-model="time1"
type="time"
format="HH:mm:ss"
placeholder="请选择时间"
/>
<!-- 仅时分 -->
<neo-datetime-pro
v-model="time2"
type="time"
format="HH:mm"
placeholder="请选择时间"
/>
<!-- 仅小时 -->
<neo-datetime-pro
v-model="time3"
type="time"
format="HH"
placeholder="请选择小时"
/>
</template>
<script>
export default {
data() {
return {
time1: '',
time2: '',
time3: ''
}
}
}
</script>
```
### 快捷选项
```vue
<template>
<neo-datetime-pro
v-model="dateRange"
type="daterange"
:shortcuts="shortcuts"
placeholder="请选择日期范围"
/>
</template>
<script>
export default {
data() {
return {
dateRange: [],
shortcuts: [
{ text: '今天', value: 'today' },
{ text: '昨天', value: 'yesterday' },
{ text: '最近7天', value: 'last7days' },
{ text: '最近30天', value: 'last30days' },
{ text: '本周', value: 'thisweek' },
{ text: '本月', value: 'thismonth' }
]
}
}
}
</script>
```
### 禁用日期
```vue
<template>
<neo-datetime-pro
v-model="date"
:disabled-date="disabledDate"
placeholder="请选择日期"
/>
</template>
<script>
export default {
data() {
return {
date: ''
}
},
methods: {
// 禁用过去的日期
disabledDate(date) {
return date < new Date()
}
}
}
</script>
```
### 最小/最大日期限制
```vue
<template>
<neo-datetime-pro
v-model="date"
:min-date="minDate"
:max-date="maxDate"
placeholder="请选择日期"
/>
</template>
<script>
export default {
data() {
return {
date: '',
minDate: '2025-01-01',
maxDate: '2025-12-31'
}
}
}
</script>
```
### 使用服务器时间
```vue
<template>
<neo-datetime-pro
v-model="date"
:current-time="serverTime"
placeholder="请选择日期"
/>
</template>
<script>
export default {
data() {
return {
date: '',
serverTime: null
}
},
async mounted() {
// 从接口获取服务器时间
const res = await api.getServerTime()
this.serverTime = res.data.time // 支持 Date对象、时间戳、字符串
}
}
</script>
```
## API
### Props
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| modelValue / v-model | String / Array / Date | - | 绑定值 |
| type | String | date | 选择器类型:date/datetime/time/daterange/datetimerange |
| format | String | YYYY-MM-DD | 日期/时间格式,时间选择器会根据 format 智能显示列:<br>• `YYYY-MM-DD` 日期<br>• `YYYY-MM-DD HH:mm:ss` 日期时间<br>• `HH:mm:ss` 时分秒<br>• `HH:mm` 仅时分<br>• `HH` 仅小时 |
| placeholder | String | 请选择 | 占位文本 |
| disabled | Boolean | false | 是否禁用 |
| readonly | Boolean | false | 是否只读 |
| clearable | Boolean | true | 是否显示清空按钮 |
| shortcuts | Array | [] | 快捷选项 |
| disabledDate | Function | - | 禁用日期函数,返回 true 表示禁用 |
| minDate | String / Date | - | 最小日期 |
| maxDate | String / Date | - | 最大日期 |
| showWeekNumber | Boolean | false | 是否显示周序号 |
| locale | String | zh | 语言:zh/en |
| startOfWeek | Number | 0 | 周起始日:0(周日)- 6(周六) |
| currentTime | Date / String / Number | null | 当前时间(支持从接口获取),未传入时使用客户端时间 |
### Events
| 事件名 | 参数 | 说明 |
|--------|------|------|
| change | value | 选中值改变时触发 |
| confirm | value | 点击确定按钮时触发 |
| clear | - | 点击清空按钮时触发 |
### Shortcuts 快捷选项格式
```javascript
[
{ text: '今天', value: 'today' },
{ text: '昨天', value: 'yesterday' },
{ text: '最近7天', value: 'last7days' },
{ text: '最近30天', value: 'last30days' },
{ text: '本周', value: 'thisweek' },
{ text: '本月', value: 'thismonth' },
// 自定义快捷选项
{
text: '自定义',
value: () => {
return ['2025-01-01', '2025-12-31']
}
}
]
```
## 使用建议
1. **日期格式**:支持常见格式如 `YYYY-MM-DD`、`YYYY-MM-DD HH:mm:ss` 等
2. **智能时间格式**:时间选择器会根据 `format` 自动显示对应的列
- `HH:mm:ss` 显示时/分/秒三列
- `HH:mm` 显示时/分两列
- `HH` 仅显示小时一列
3. **范围选择**:`daterange` 和 `datetimerange` 模式下,v-model 绑定数组 `[startDate, endDate]`
4. **禁用规则**:`disabledDate` 函数接收日期对象,返回 `true` 表示禁用该日期
5. **快捷选项**:支持内置值(today、yesterday等)和自定义函数
6. **移动端优化**:底部弹出交互,触摸友好
## 常见问题
### 1. 如何禁用周末?
```javascript
disabledDate(date) {
const day = date.getDay()
return day === 0 || day === 6 // 0=周日, 6=周六
}
```
### 2. 如何设置默认值?
```javascript
data() {
return {
date: '2025-10-30' // 字符串格式
// 或
date: new Date() // Date 对象
}
}
```
### 3. 如何获取时间戳?
```javascript
@change="handleChange"
methods: {
handleChange(value) {
const timestamp = new Date(value).getTime()
console.log(timestamp)
}
}
```
## 许可
MIT License
## 更新日志
见 [changelog.md](./changelog.md)
|