index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-date-picker
  3. v-model="selected"
  4. type="datetimerange"
  5. :default-time="defaultTimeVar"
  6. range-separator="至"
  7. start-placeholder="开始日期时间"
  8. end-placeholder="结束日期时间"
  9. value-format="x"
  10. format="YYYY-MM-DD HH:mm"
  11. :style="{ width: '380px' }"
  12. v-bind="attrs"
  13. @change="onChange"
  14. />
  15. </template>
  16. <script setup lang="ts">
  17. import { ref, watch, useAttrs } from 'vue';
  18. // import { ElDatePicker } from 'element-plus';
  19. defineOptions({
  20. name: 'SelectRangeDatetime',
  21. });
  22. type TimeType = number | undefined;
  23. const props = withDefaults(
  24. defineProps<{
  25. startTime: TimeType;
  26. endTime: TimeType;
  27. // showTime prop is implicit in datetimerange type of el-date-picker
  28. }>(),
  29. {}
  30. );
  31. const emit = defineEmits(['update:startTime', 'update:endTime', 'change']);
  32. const attrs = useAttrs();
  33. const selected = ref<number[]>();
  34. // Helper for default-time prop in ElDatePicker
  35. // It expects an array of two Date objects
  36. const defaultTimeVar = ref([
  37. new Date(2000, 1, 1, 0, 0, 0),
  38. new Date(2000, 1, 1, 23, 59, 59),
  39. ]);
  40. function onChange(value: any) {
  41. const vals = (value || []) as TimeType[];
  42. // Element Plus with value-format="x" returns timestamps in milliseconds
  43. // Arco's timestamp might be seconds, ensure consistency or convert if needed.
  44. // Assuming timestamps are compatible for now.
  45. emit('update:startTime', vals[0]);
  46. emit('update:endTime', vals[1]);
  47. emit('change', vals);
  48. }
  49. watch(
  50. () => [props.startTime, props.endTime],
  51. (val) => {
  52. // Ensure that null/undefined values are handled correctly for el-date-picker
  53. if (val[0] !== undefined && val[1] !== undefined && val[0] !== null && val[1] !== null) {
  54. selected.value = [val[0], val[1]] as number[];
  55. } else {
  56. selected.value = undefined; // Or an empty array [], depending on desired behavior for empty state
  57. }
  58. },
  59. {
  60. immediate: true,
  61. }
  62. );
  63. </script>