xtf-datetime-picker
组件说明
xtf-datetime-picker 是日期时间选择器组件,用于选择日期、时间或日期时间。支持多种模式(date/time/datetime/year-month)、日期范围选择、快捷选项、滚轮选择和玻璃拟态样式,适用于表单日期输入、预约时间和筛选条件等场景。
基础用法
1. 日期选择
通过 mode="date" 选择日期:
vue
<template>
<view>
<xtf-cell title="选择日期" :value="dateLabel" arrow @click="showDatePicker = true" />
<xtf-datetime-picker
v-model="dateValue"
:show="showDatePicker"
mode="date"
title="选择日期"
@confirm="onDateConfirm"
@cancel="showDatePicker = false"
/>
</view>
</template>
<script>
export default {
data() {
return {
dateValue: new Date().toISOString(),
showDatePicker: false
}
},
computed: {
dateLabel() {
if (!this.dateValue) return '请选择'
const d = new Date(this.dateValue)
return (
d.getFullYear() +
'/' +
String(d.getMonth() + 1).padStart(2, '0') +
'/' +
String(d.getDate()).padStart(2, '0')
)
}
},
methods: {
onDateConfirm(payload) {
this.dateValue = payload.value
this.showDatePicker = false
}
}
}
</script>2. 时间选择
通过 mode="time" 选择时间:
vue
<template>
<view>
<xtf-cell title="选择时间" :value="timeLabel" arrow @click="showTimePicker = true" />
<xtf-datetime-picker
v-model="timeValue"
:show="showTimePicker"
mode="time"
title="选择时间"
@confirm="onTimeConfirm"
@cancel="showTimePicker = false"
/>
</view>
</template>
<script>
export default {
data() {
return {
timeValue: '',
showTimePicker: false
}
},
computed: {
timeLabel() {
return this.timeValue || '请选择'
}
},
methods: {
onTimeConfirm(payload) {
this.timeValue = payload.value
this.showTimePicker = false
}
}
}
</script>3. 日期时间选择
通过 mode="datetime" 同时选择日期和时间:
vue
<template>
<view>
<xtf-cell
title="选择日期时间"
:value="datetimeLabel"
arrow
@click="showDatetimePicker = true"
/>
<xtf-datetime-picker
v-model="datetimeValue"
:show="showDatetimePicker"
mode="datetime"
title="选择日期时间"
@confirm="onDatetimeConfirm"
@cancel="showDatetimePicker = false"
/>
</view>
</template>
<script>
export default {
data() {
return {
datetimeValue: '',
showDatetimePicker: false
}
},
computed: {
datetimeLabel() {
return this.datetimeValue || '请选择'
}
},
methods: {
onDatetimeConfirm(payload) {
this.datetimeValue = payload.value
this.showDatetimePicker = false
}
}
}
</script>4. 日期范围选择
通过 range 启用范围选择模式:
vue
<template>
<view>
<xtf-cell title="选择日期范围" :value="rangeLabel" arrow @click="showRangePicker = true" />
<xtf-datetime-picker
v-model="rangeValue"
:show="showRangePicker"
mode="date"
range
title="选择日期范围"
@confirm="onRangeConfirm"
@cancel="showRangePicker = false"
/>
</view>
</template>
<script>
export default {
data() {
return {
rangeValue: [],
showRangePicker: false
}
},
computed: {
rangeLabel() {
if (!this.rangeValue || !this.rangeValue.length) return '请选择'
return this.rangeValue.join(' 至 ')
}
},
methods: {
onRangeConfirm(payload) {
this.rangeValue = payload.value
this.showRangePicker = false
}
}
}
</script>全部属性
| 属性 | 类型 | 默认值 | 作用描述 | 适用范围 |
|---|---|---|---|---|
show | Boolean | false | 是否显示选择器 | 显示控制 |
value / modelValue | String | Number | Date | Array | '' | 当前选中值 | 双向绑定 |
mode | String | 'date' | datetime / date / time / year-month / month-day / hour-minute | 选择模式 |
showSeconds | Boolean | false | datetime 模式是否追加秒列;开启后日期时间回显包含秒 | 精确时间选择 |
range | Boolean | false | 是否范围选择 | 范围模式 |
variant | String | 'glass' | 视觉变体 | 视觉样式 |
layout | String | 'default' | 布局模式:default 为增强日期面板,system 为居中标题、关闭图标、连续滚轮选中条与底部双按钮 | 系统日期时间选择 |
rangeSeparator | String | '至' | 范围分隔符 | 范围显示 |
shortcuts | Array | [] | 自定义快捷选项 | 快捷选项 |
builtinShortcuts | Boolean | true | 是否显示内置快捷选项 | 内置快捷 |
minDate | String | Number | Date | '' | 最小日期 | 日期限制 |
maxDate | String | Number | Date | '' | 最大日期 | 日期限制 |
minHour | String | Number | 0 | 最小小时 | 时间限制 |
maxHour | String | Number | 23 | 最大小时 | 时间限制 |
minMinute | String | Number | 0 | 最小分钟 | 时间限制 |
maxMinute | String | Number | 59 | 最大分钟 | 时间限制 |
filter | Function | null | 选项过滤函数 | 过滤选项 |
formatter | Function | null | 选项格式化函数 | 格式化 |
title | String | '' | 选择器标题 | 标题 |
showToolbar | Boolean | true | 是否显示工具栏 | 工具栏 |
loading | Boolean | false | 是否加载中 | 加载状态 |
confirmText | String | '' | 确认按钮文字 | 按钮文字 |
cancelText | String | '' | 取消按钮文字 | 按钮文字 |
closeOnClickOverlay | Boolean | true | 点击遮罩是否关闭 | 关闭行为 |
safeAreaInsetBottom | Boolean | true | 是否适配底部安全区 | 安全区 |
duration | String | Number | '' | 动画时长 | 动画 |
zIndex | String | Number | '' | 层级 | 层级 |
showHero | Boolean | true | 是否显示顶部预览区 | 预览区 |
showHeroMeta / showCurrentValue / showRangeValue | Boolean | true | Hero 元信息、单值和范围摘要开关 | Hero 区 |
loadingText / popupCustomClass | String | '' | 加载文案和弹层类名 | 工具栏/弹层 |
toolbarClass、heroClass、heroMetaClass、summaryClass、shortcutsClass、bodyClass | String | '' | 对应区域类名;各区域均有同名 Style 属性 | 样式 |
showShortcuts | Boolean | true | 是否显示快捷选项 | 快捷选项 |
showWheel | Boolean | true | 是否显示滚轮 | 滚轮 |
showColumnHeader | Boolean | true | 是否显示列标题 | 列标题 |
customClass | String | '' | 自定义类名 | 样式覆盖 |
customStyle | String | Object | '' | 自定义样式 | 动态样式覆盖 |
事件
| 事件名称 | 触发时机 | 回调参数 | 参数说明 |
|---|---|---|---|
input / update:value / update:modelValue | 确认时触发 | (value) | 格式化值或范围数组 |
change / confirm | 确认时触发 | (payload) | 单值 { value, date, mode, range };范围 { value, start, end, mode, range } |
cancel | 点击取消按钮时触发 | - | - |
shortcut-click | 点击快捷选项时触发 | (shortcut) | 快捷选项数据 |
update:show | 显示状态变化时触发 | (show: Boolean) | 显示状态 |
插槽
| 插槽名 | 作用域参数 | 说明 |
|---|---|---|
hero | { range, mode, heroTitle, currentLabel, startLabel, endLabel, activeRangeKey, switchRangeKey } | 替换完整顶部预览区。 |
hero-meta | { range, mode, heroTitle } | 替换顶部标题区域。 |
range-summary | { startLabel, endLabel, activeRangeKey, switchRangeKey, rangeSeparator } | 替换范围选择的开始和结束摘要。 |
current-summary | { currentLabel, mode } | 替换单值选择的当前值摘要。 |
shortcuts | { shortcuts, handleShortcut } | 替换快捷项列表;通过 handleShortcut(item) 应用快捷项。 |
插槽使用示例
vue
<template>
<view>
<xtf-button label="选择日期范围" @click="show = true" />
<xtf-datetime-picker
v-model="value"
:show="show"
range
mode="date"
@update:show="show = $event"
@confirm="onConfirm"
>
<template #range-summary="{ startLabel, endLabel, activeRangeKey, switchRangeKey }">
<view style="display: flex; justify-content: space-between; padding: 20rpx">
<text
@click="switchRangeKey('start')"
:style="{ color: activeRangeKey === 'start' ? '#2563eb' : '#64748b' }"
>开始:{{ startLabel }}</text>
<text
@click="switchRangeKey('end')"
:style="{ color: activeRangeKey === 'end' ? '#2563eb' : '#64748b' }"
>结束:{{ endLabel }}</text>
</view>
</template>
<template #shortcuts="{ shortcuts, handleShortcut }">
<view style="display: flex; padding: 0 24rpx 20rpx">
<text
v-for="item in shortcuts"
:key="item.key"
style="margin-right: 20rpx"
@click="handleShortcut(item)"
>{{ item.label }}</text>
</view>
</template>
</xtf-datetime-picker>
</view>
</template>
<script>
export default {
data() {
return { show: false, value: [] }
},
methods: {
onConfirm({ value }) {
this.value = value
}
}
}
</script>主题说明
- 弹出层使用
xtf-popup组件 - 工具栏按钮使用
xtf-button组件 - 支持通过
variant切换视觉风格 - 滚轮区域使用
scroll-view实现 - 选中指示器使用
indicator样式
如需全局调整主题,请在 xtf-config-provider 或主题配置中覆盖相关 CSS 变量。