| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- <template>
- <a-range-picker
- v-model:value="rangeTimes"
- :show-time="props.showTime"
- :valueFormat="props.valueFormat"
- :presets="props.rangePresets"
- />
- </template>
- <script setup lang="ts">
- import { computed } from 'vue'
- import dayjs, { type Dayjs } from 'dayjs'
- defineOptions({
- name: 'rangePicker',
- })
- type RangeValue = [Dayjs, Dayjs]
- interface Props {
- start: string | Dayjs // 开始时间
- end: string | Dayjs // 结束时间
- showTime?: boolean // 是否显示时间选择器
- valueFormat?: string // 时间格式
- rangePresets?: {
- label: string
- value: RangeValue
- }[]
- }
- const emit = defineEmits<{
- (e: 'update:start', value: string): void
- (e: 'update:end', value: string): void
- }>()
- const props = withDefaults(defineProps<Props>(), {
- start: '',
- end: '',
- showTime: false,
- valueFormat: 'YYYY-MM-DD', // 时间格式 YYYY-MM-DD HH:mm:ss
- rangePresets: () => [
- { label: '今天', value: [dayjs().startOf('day'), dayjs().endOf('day')] },
- { label: '最近7天', value: [dayjs().add(-6, 'd').startOf('day'), dayjs().endOf('day')] },
- { label: '最近14天', value: [dayjs().add(-13, 'd').startOf('day'), dayjs().endOf('day')] },
- { label: '最近30天', value: [dayjs().add(-29, 'd').startOf('day'), dayjs().endOf('day')] },
- { label: '最近90天', value: [dayjs().add(-89, 'd').startOf('day'), dayjs().endOf('day')] },
- ],
- })
- const rangeTimes = computed({
- get: () => {
- if (props.start && props.end) {
- const isValidRange = [props.start, props.end].every((v) => dayjs(v).isValid())
- return isValidRange
- ? [
- dayjs.isDayjs(props.start) ? props.start : dayjs(props.start),
- dayjs.isDayjs(props.end) ? props.end : dayjs(props.end),
- ]
- : undefined
- }
- return undefined
- },
- set: (val: RangeValue | undefined) => {
- if (Array.isArray(val) && val.length === 2) {
- const start = dayjs(val[0])
- const end = dayjs(val[1])
- const format = (d: Dayjs) => {
- const date = dayjs(d)
- return date.isValid() ? date.format(props.valueFormat) : ''
- }
- emit('update:start', start.isValid() ? format(val[0]) : '')
- emit('update:end', end.isValid() ? format(val[1]) : '')
- } else {
- emit('update:start', '')
- emit('update:end', '')
- }
- },
- })
- </script>
- <style scoped lang="less"></style>
|