发现 Vant 没有提供用于抉择 HH:mm 的工夫范畴选择器,于是手动实现一下。
// ———— RangeTimePicker.vue ————<template> <div> <ActionSheet v-model:show="props.show"> <DatetimePicker v-if="props.show && showEndTimePicker === false" v-model="startTime" @confirm="showEndTimePicker = true" @cancel="onClose" type="time" title="开始工夫" :min-hour="0" :max-hour="23" /> <DatetimePicker v-if="props.show && showEndTimePicker" v-model="endTime" @confirm="timeConfirm" @cancel="onClose(true)" cancel-button-text="返回" type="time" title="完结工夫" :min-hour="0" :max-hour="23" /> </ActionSheet> </div></template><script setup lang="ts">import { ActionSheet, DatetimePicker, Toast } from 'vant';import { ref } from 'vue';function compareTime(time1: string, time2: string) { if (!(/^\d\d:\d\d$/.test(time1) && /^\d\d:\d\d$/.test(time2))) { throw new Error('工夫格局不非法,格局必须为:HH:mm 模式') } const timeNumber1 = time1.match(/\d/g)?.reduce((ac, cur) => ac += cur) || '' const timeNumber2 = time2.match(/\d/g)?.reduce((ac, cur) => ac += cur) || '' return timeNumber1 < timeNumber2}const props = defineProps({ show: { type: Boolean, default: false }, times: { type: Array, default: ["09:00", "12:00"] }})interface EmitsType { (e: 'update:times', times: string[]): void (e: 'update:show', show: boolean): void}const emit = defineEmits<EmitsType>()const showEndTimePicker = ref(false)const startTime = ref<string>(typeof props.times[0] === 'string' ? props.times[0] : '')const endTime = ref<string>(typeof props.times[1] === 'string' ? props.times[1] : '')const onClose = (isSetEndTime?: boolean) => { if (isSetEndTime) { showEndTimePicker.value = false return } emit('update:show', false) showEndTimePicker.value = false}const timeConfirm = () => { if (!compareTime(startTime.value, endTime.value)) { Toast("开始工夫不能小于完结工夫") return } emit('update:times', [startTime.value, endTime.value]) onClose()}</script><style lang="less"></style>
成果如下: