Skip to content

DatetimePickerView 日期时间选择器视图

14:29

组件概况

组件概述

DatetimePickerView 是一个日期时间选择器视图组件,基于 picker-view 实现,支持多种选择类型(日期、年月、时间、日期时间、年份),可自定义格式、范围和样式,常用于表单中的日期时间选择场景。

详细功能描述

  • 支持多种选择类型:日期(date)、年月(year-month)、时间(time)、日期时间(datetime)、年份(year)
  • 支持自定义日期范围(最小日期和最大日期)
  • 支持自定义时间范围(最小/最大小时、分钟、秒)
  • 支持显示秒选择(useSecond 属性)
  • 支持自定义格式化选项文案
  • 支持自定义过滤选项
  • 支持自定义列格式化
  • 支持加载状态
  • 支持自定义滚动高度和选项高度
  • 支持立即触发 change 事件(immediateChange 属性)
  • 支持联动更新,如选择年份后自动更新月份,选择月份后自动更新日期

适用业务场景

  • 表单中的日期时间选择
  • 预约系统的时间选择
  • 生日选择器
  • 事件日历的日期选择
  • 数据筛选的时间范围选择
  • 活动报名的截止时间选择

完整API参考

Props

名称类型默认值必填描述
modelValuestring / number-选中项,当 type 为 time 时,类型为字符串(如 "12:30"),否则为时间戳
typestringdatetime选择器类型,可选值:date / year-month / time / datetime / year
loadingbooleanfalse加载中状态
loadingColorstring#4D80F0加载的颜色,只能使用十六进制的色值写法,且不能使用缩写
columnsHeightnumber217picker内部滚筒高度
itemHeightnumber35picker item的高度
valueKeystringvalue选项的key
labelKeystringlabel选项的label
filterfunction-自定义过滤选项的函数,返回列的选项数组
formatterfunction-自定义弹出层选项文案的格式化函数,返回一个字符串
columnFormatterfunction-自定义列的格式化函数
minDatenumber当前年份-10年的1月1日最小日期(时间戳)
maxDatenumber当前年份+10年的12月31日最大日期(时间戳)
minHournumber0最小小时,time类型时生效
maxHournumber23最大小时,time类型时生效
minMinutenumber0最小分钟,time类型时生效
maxMinutenumber59最大分钟,time类型时生效
useSecondbooleanfalse是否显示秒选择,仅在 time 和 datetime 类型下生效
minSecondnumber0最小秒数,仅在 time 和 datetime 类型下生效
maxSecondnumber59最大秒数,仅在 time 和 datetime 类型下生效
immediateChangebooleanfalse是否在手指松开时立即触发picker-view的 change 事件
customStylestring''自定义根节点样式
customClassstring''自定义根节点样式类

Events

事件名触发条件参数说明
change选中值变化时触发{ value: string/number, picker: object } - 选中的值和选择器实例
pickstart开始滚动时触发-
pickend滚动结束时触发-
update:modelValue选中值变化时触发value: string/number - 选中的值

Methods

方法名参数返回值功能说明
updateColumns-DatetimePickerViewOption[][]更新选项列数据
setColumnscolumnList: DatetimePickerViewOption[][]-设置选项列数据
getSelects-Record<string, any>[]获取当前选中的数据
correctValuevalue: string/numberstring/number修正时间值,确保在有效范围内
getOriginColumns-{ type: string, values: number[] }[]获取原始的选项列数据

Slots

插槽名作用域变量使用说明

多场景使用示例代码

基础用法

vue
<template>
  <view>
    <!-- 基础日期时间选择器视图 -->
    <wd-datetime-picker-view v-model="datetime" />
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const datetime = ref<number>(Date.now())
</script>

时间类型选择器

vue
<template>
  <view>
    <!-- 时间类型选择器 -->
    <wd-datetime-picker-view 
      v-model="time" 
      type="time" 
      use-second
    />
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const time = ref<string>("12:30:45")
</script>

日期类型选择器

vue
<template>
  <view>
    <!-- 日期类型选择器 -->
    <wd-datetime-picker-view 
      v-model="date" 
      type="date"
      :min-date="minDate"
      :max-date="maxDate"
    />
  </view>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue'
import dayjs from 'dayjs'

const date = ref<number>(Date.now())
const minDate = computed(() => dayjs().subtract(1, 'year').valueOf())
const maxDate = computed(() => dayjs().add(1, 'year').valueOf())
</script>

年月类型选择器

vue
<template>
  <view>
    <!-- 年月类型选择器 -->
    <wd-datetime-picker-view 
      v-model="yearMonth" 
      type="year-month"
      :formatter="formatter"
    />
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const yearMonth = ref<number>(Date.now())

// 自定义格式化函数
const formatter = (type: string, value: string) => {
  if (type === 'year') {
    return `${value}年`
  }
  if (type === 'month') {
    return `${value}月`
  }
  return value
}
</script>

年份类型选择器

vue
<template>
  <view>
    <!-- 年份类型选择器 -->
    <wd-datetime-picker-view 
      v-model="year" 
      type="year"
      :min-date="minDate"
      :max-date="maxDate"
    />
  </view>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue'
import dayjs from 'dayjs'

const year = ref<number>(Date.now())
const minDate = computed(() => dayjs().subtract(5, 'year').valueOf())
const maxDate = computed(() => dayjs().add(5, 'year').valueOf())
</script>

自定义样式和加载状态

vue
<template>
  <view>
    <!-- 自定义样式和加载状态 -->
    <wd-datetime-picker-view 
      v-model="datetime"
      :loading="loading"
      loading-color="#ff6b6b"
      columns-height="300"
      item-height="45"
      custom-style="border: 1px solid #eee; border-radius: 8px;"
    />
    <wd-button @click="toggleLoading">
      {{ loading ? '关闭加载' : '开启加载' }}
    </wd-button>
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const datetime = ref<number>(Date.now())
const loading = ref<boolean>(false)

const toggleLoading = () => {
  loading.value = !loading.value
}
</script>

样式定制指南

customStyle 用法

使用 customStyle 属性可以直接为选择器视图添加内联样式:

vue
<wd-datetime-picker-view 
  custom-style="border: 1px solid #eee; border-radius: 8px; padding: 10px;"
/>

customClass 用法

通过 customClass 属性可以为组件添加自定义CSS类:

vue
<wd-datetime-picker-view custom-class="custom-picker" />

<style>
.custom-picker {
  border: 1px solid #eee;
  border-radius: 8px;
  padding: 10px;
  background-color: #f8f9fa;
}
</style>

滚动高度和选项高度

可以通过 columnsHeightitemHeight 属性调整选择器的滚动高度和选项高度:

vue
<wd-datetime-picker-view 
  columns-height="300"
  item-height="45"
/>

注意事项

  1. 数据类型: 当 typetime 时,modelValue 应为字符串格式(如 "12:30" 或 "12:30:45");其他类型时应为时间戳。
  2. 联动更新: 对于日期和日期时间类型,选择年份后会自动更新月份,选择月份后会自动更新日期,确保日期的有效性。
  3. 加载状态: loading 属性控制加载状态,loadingColor 属性控制加载动画的颜色,仅支持十六进制完整色值。
  4. 格式化函数: formatter 函数用于格式化选项文案,columnFormatter 函数用于自定义整个列的格式化。
  5. 过滤函数: filter 函数用于过滤选项,可以根据需要自定义显示的选项。
  6. 秒选择: 只有 typetimedatetime 时,useSecond 属性才有效。
  7. 立即触发: immediateChange 属性控制是否在手指松开时立即触发 change 事件,仅微信小程序和支付宝小程序支持。
  8. 性能优化: 当选择范围较大时,建议合理设置 minDatemaxDate 属性,避免生成过多选项导致性能问题。
  9. 样式隔离: 组件使用 styleIsolation: 'shared',确保自定义样式能正常生效。

📖 Released under the MIT License