zs
2025-05-05 25750ab29ce4e243f4e4e17a796167f3a0f0697b
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
import { defineComponent, onMounted, reactive, ref, watch } from 'vue'
import styles from './DateTimePickRange.module.scss'
import dayjs from 'dayjs'
import { ElMessage } from 'element-plus'
export default defineComponent({
  name: '日期范围',
  props: {
    label: {
      type: String,
      default: '时间范围',
    },
    From: {
      type: String,
      default: '',
      requred: true,
    },
    To: {
      type: String,
      default: '',
      requred: true,
    },
    valueFormat: {
      type: String,
      default: 'YYYY-MM-DD HH:mm:ss',
    },
    clearable: {
      type: Boolean,
      default: true
    }
  },
  emits: ['change'],
  setup(props, { attrs, slots, emit }) {
    // todo 支持配置默认时间
    const times = reactive({
      From: '',
      To: '',
    })
 
    onMounted(() => {
      if (props.From) {
        times.From = props.From
      }
      if (props.To) {
        times.To = props.To
      }
    })
 
    const onChangeFrom = (val: Date) => {
      console.log(val)
      if (times.To && dayjs(val).isAfter(times.To)) {
        ElMessage.warning('开始时间必须比结束时间小')
        return
      }
      emit('change', times)
    }
 
    const onChangeTo = (val: Date) => {
      console.log(val);
      if (times.To && dayjs(val).isBefore(times.From)) {
        ElMessage.warning('开始时间必须比结束时间小')
        return
      }
      emit('change', times)
    }
 
    return () => {
      return (
        <div class={styles.DateTimePickRange}>
          <span class={styles.label}>{props.label}</span>
          <el-date-picker
            v-model={times.From}
            type="datetime"
            placeholder="请选择开始时间"
            onChange={onChangeFrom}
            valueFormat={props.valueFormat}
            clearable={props.clearable}
          />
          <span class={styles.line}>-</span>
          <el-date-picker
            v-model={times.To}
            type="datetime"
            placeholder="请选择结束时间"
            onChange={onChangeTo}
            valueFormat={props.valueFormat}
            clearable={props.clearable}
          />
        </div>
      )
    }
  },
})