index.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 (
  54. val[0] !== undefined &&
  55. val[1] !== undefined &&
  56. val[0] !== null &&
  57. val[1] !== null
  58. ) {
  59. selected.value = [val[0], val[1]] as number[];
  60. } else {
  61. selected.value = undefined; // Or an empty array [], depending on desired behavior for empty state
  62. }
  63. },
  64. {
  65. immediate: true,
  66. }
  67. );
  68. </script>