index.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <div class="flex flex-row items-center gap-2">
  3. <el-radio-group v-model="shortcutDays" @change="handleShortcutDaysChange">
  4. <el-radio-button :label="1">昨天</el-radio-button>
  5. <el-radio-button :label="7">最近7天</el-radio-button>
  6. <el-radio-button :label="30">最近30天</el-radio-button>
  7. </el-radio-group>
  8. <el-date-picker
  9. v-model="times"
  10. value-format="YYYY-MM-DD HH:mm:ss"
  11. type="daterange"
  12. start-placeholder="开始日期"
  13. end-placeholder="结束日期"
  14. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  15. :shortcuts="shortcuts"
  16. class="!w-240px"
  17. @change="emitDateRangePicker"
  18. />
  19. <slot></slot>
  20. </div>
  21. </template>
  22. <script lang="ts" setup>
  23. import dayjs from 'dayjs'
  24. import * as DateUtil from '@/utils/formatTime'
  25. /** 快捷日期范围选择组件 */
  26. defineOptions({ name: 'ShortcutDateRangePicker' })
  27. const shortcutDays = ref(7) // 日期快捷天数(单选按钮组), 默认7天
  28. const times = ref<[string, string]>(['', '']) // 时间范围参数
  29. defineExpose({ times }) // 暴露时间范围参数
  30. /** 日期快捷选择 */
  31. const shortcuts = [
  32. {
  33. text: '昨天',
  34. value: () => DateUtil.getDayRange(new Date(), -1)
  35. },
  36. {
  37. text: '最近7天',
  38. value: () => DateUtil.getLast7Days()
  39. },
  40. {
  41. text: '本月',
  42. value: () => [dayjs().startOf('M'), dayjs().subtract(1, 'd')]
  43. },
  44. {
  45. text: '最近30天',
  46. value: () => DateUtil.getLast30Days()
  47. },
  48. {
  49. text: '最近1年',
  50. value: () => DateUtil.getLast1Year()
  51. }
  52. ]
  53. /** 设置时间范围 */
  54. function setTimes() {
  55. const beginDate = dayjs().subtract(shortcutDays.value, 'd')
  56. const yesterday = dayjs().subtract(1, 'd')
  57. times.value = DateUtil.getDateRange(beginDate, yesterday)
  58. }
  59. /** 快捷日期单选按钮选中 */
  60. const handleShortcutDaysChange = async () => {
  61. // 设置时间范围
  62. setTimes()
  63. // 发送时间范围选中事件
  64. await emitDateRangePicker()
  65. }
  66. /** 触发事件:时间范围选中 */
  67. const emits = defineEmits<{
  68. (e: 'change', times: [dayjs.ConfigType, dayjs.ConfigType]): void
  69. }>()
  70. /** 触发时间范围选中事件 */
  71. const emitDateRangePicker = async () => {
  72. emits('change', times.value)
  73. }
  74. /** 初始化 **/
  75. onMounted(() => {
  76. handleShortcutDaysChange()
  77. })
  78. </script>