• elementui日期时间选择框自定义组件


    1.需求场景

    业务中需要,日期选择框方便客户对日期的选择(比如近5天,本周,本月,本年等等),并按小时展示。

    2.组件代码MyDateTimeChange.vue

    1. <template>
    2. <el-date-picker
    3. v-model="internalValue"
    4. :default-time="['00:00:00', '23:59:59']"
    5. size="small"
    6. :style="{width:width,height:height}"
    7. type="datetimerange"
    8. range-separator="-"
    9. :start-placeholder="$t('datepicker.startDate')"
    10. :end-placeholder="$t('datepicker.endDate')"
    11. :picker-options="pickerOptions"
    12. :value-format="customFormat"
    13. :format="format"
    14. :clearable="clearable"
    15. @change="dateChanged"
    16. ></el-date-picker>
    17. </template>
    18. <script>
    19. export default {
    20. name: "MyDateChange",
    21. props: {
    22. width: {
    23. type: String,
    24. default: ''
    25. },
    26. height:{
    27. type:String,
    28. default:'41px'
    29. },
    30. customFormat:{
    31. type:String,
    32. default: 'yyyy-MM-dd'
    33. },
    34. value:{
    35. type:Array,
    36. },
    37. format:{
    38. type:String,
    39. default: 'yyyy-MM-dd'
    40. },
    41. clearable: {
    42. type: Boolean,
    43. default: false
    44. },
    45. },
    46. data() {
    47. const _this = this
    48. return {
    49. pickerOptions: {
    50. shortcuts: [{
    51. text: this.$t('datepicker.today'),
    52. onClick(picker) {
    53. const start = _this.getFirstTime(new Date());
    54. const end = _this.getEndTime(new Date());
    55. //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
    56. picker.$emit('pick', [start, end]);
    57. }
    58. },
    59. {
    60. text: this.$t('datepicker.thisWeek'),
    61. onClick: (picker) => {
    62. const start = _this.getFirstTime(this.getStartOfWeek());
    63. const end = _this.getEndTime(new Date());
    64. //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
    65. picker.$emit('pick', [start, end]);
    66. }
    67. }, {
    68. text: this.$t('datepicker.thisMonth'),
    69. onClick: (picker) => {
    70. const start = _this.getFirstTime(this.getStartOfMonth());
    71. const end = _this.getEndTime(new Date());
    72. //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
    73. picker.$emit('pick', [start, end]);
    74. }
    75. },
    76. {
    77. text: this.$t('datepicker.thisYear'),
    78. onClick: (picker) => {
    79. const start = _this.getFirstTime(this.getFirstDayOfYear());
    80. const end = _this.getEndTime(new Date());
    81. //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
    82. picker.$emit('pick', [start, end]);
    83. }
    84. },
    85. {
    86. text: this.$t('datepicker.recentSeven'),
    87. onClick(picker) {
    88. const start = new Date();
    89. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
    90. _this.getFirstTime(start);
    91. const end = _this.getEndTime(new Date());
    92. picker.$emit('pick', [start, end]);
    93. }
    94. },
    95. {
    96. text: this.$t('datepicker.recentFifteen'),
    97. onClick(picker) {
    98. const start = new Date();
    99. start.setTime(start.getTime() - 3600 * 1000 * 24 * 15);
    100. _this.getFirstTime(start);
    101. const end = _this.getEndTime(new Date());
    102. picker.$emit('pick', [start, end]);
    103. }
    104. },
    105. {
    106. text: this.$t('datepicker.recentThirty'),
    107. onClick(picker) {
    108. const start = new Date();
    109. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
    110. _this.getFirstTime(start);
    111. const end = _this.getEndTime(new Date());
    112. picker.$emit('pick', [start, end]);
    113. }
    114. }
    115. ]
    116. },
    117. dateRange: '',
    118. submitButtonLoading: false,
    119. internalValue:this.value
    120. };
    121. },
    122. watch:{
    123. value: {
    124. handler(val) {
    125. this.$set(this,"internalValue",val);
    126. return val
    127. }
    128. }
    129. },
    130. methods: {
    131. getFirstTime(day){
    132. day.setHours(0);
    133. day.setMinutes(0);
    134. day.setSeconds(0);
    135. day.setMilliseconds(0);
    136. return day;
    137. },
    138. getEndTime(day){
    139. day.setHours(23);
    140. day.setMinutes(59);
    141. day.setSeconds(59);
    142. day.setMilliseconds(999);
    143. return day;
    144. },
    145. getStartOfWeek() {
    146. let today = new Date();
    147. let day = today.getDay(); // 获取今天是星期几 (0 是周日,1 是周一,以此类推)
    148. let startOfWeek = new Date(today); // 复制今天的日期
    149. // 将日期设置为本周的第一天 (星期日)
    150. startOfWeek.setDate(today.getDate() - day);
    151. return startOfWeek;
    152. },
    153. getStartOfMonth() {
    154. const today = new Date();
    155. const year = today.getFullYear();
    156. const month = today.getMonth(); // 获取当前月份,注意月份是从 0 开始的(0 表示一月)
    157. // 设置日期为本月的第一天
    158. const firstDay = new Date(year, month, 1);
    159. return firstDay;
    160. },
    161. getFirstDayOfYear() {
    162. const today = new Date();
    163. const year = today.getFullYear();
    164. // 设置日期为今年的第一天
    165. const firstDayOfYear = new Date(year, 0, 1); // 月份从0开始,0表示一月
    166. return firstDayOfYear;
    167. },
    168. dateChanged(newDate) {
    169. this.internalValue = newDate; // 更新内部数据
    170. this.$emit('input', newDate); // 触发父组件的更新
    171. }
    172. },
    173. };
    174. </script>
    175. <style lang="css">
    176. /*去掉了选择日期时间页面的分和秒*/
    177. .el-time-spinner__wrapper{
    178. width: 100% !important;
    179. }
    180. .el-scrollbar:nth-of-type(2){
    181. display: none;
    182. }
    183. /*去掉了选择日期时间页面的清空按钮*/
    184. .el-picker-panel__footer .el-picker-panel__link-btn.el-button--text {
    185. display: none;
    186. }
    187. </style>

    3.使用

    1. import MyDateTimeChange from "@/components/xxx/MyDateTimeChange";
    2. ......
    3. <el-form-item :label="$t('OpenapiLogStatistics.time')">
    4. <my-date-time-change v-model="dateRange" format="yyyy-MM-dd HH" custom-format="yyyy-MM-dd HH:mm:ss" width="340px" height="32px"></my-date-time-change>
    5. </el-form-item>
    6. ......
    7. data() {
    8. return {
    9. dateRange: [getNowFormatDate("-")+' 00:00:00',getNowFormatDate("-")+' 23:59:59'],
    10. }
    11. }
    12. ......
    13. // 添加日期范围
    14. export function addDateRange(params, dateRange, propName) {
    15. let search = params;
    16. search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
    17. dateRange = Array.isArray(dateRange) ? dateRange : [];
    18. if (typeof (propName) === 'undefined') {
    19. search.params['beginTime'] = dateRange[0];
    20. search.params['endTime'] = dateRange[1];
    21. } else {
    22. search.params['begin' + propName] = dateRange[0];
    23. search.params['end' + propName] = dateRange[1];
    24. }
    25. return search;
    26. }
    27. /**
    28. * 默认生成日期格式 yyyyMMdd
    29. * @param seperator1 分隔符
    30. * @returns 返回日期字符串
    31. */
    32. export function getNowFormatDate(seperator1) {
    33. seperator1 = seperator1||''
    34. let date = new Date();
    35. let year = date.getFullYear();
    36. let month = date.getMonth() + 1;
    37. let strDate = date.getDate();
    38. if (month >= 1 && month <= 9) {
    39. month = "0" + month;
    40. }
    41. if (strDate >= 0 && strDate <= 9) {
    42. strDate = "0" + strDate;
    43. }
    44. return year + seperator1 + month + seperator1 + strDate;
    45. }
    46. ......
    47. methods:{
    48. getQueryParams() {
    49. if (this.dateRange) {
    50. return this.addDateRange(this.queryParams, this.dateRange)
    51. }
    52. this.queryParams.params=[];
    53. return this.queryParams;
    54. },
    55. }

    4.效果

  • 相关阅读:
    vite.config.js或者vue.config.js配置
    【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.3p1(亲测无问题,建议收藏)
    银河麒麟系统下安装Kingbase数据库
    Java:开始Java编程生涯的小指南
    dotnet new cli 以及Abp-cli命令的简单使用
    【SpringCloud-Alibaba系列教程】12.日志链路追踪
    uniapp基础篇 - - 页面跳转和传值
    基于 Java 解释一下硬编码和非硬编码?
    6.jvm中对象创建流程与内存分配
    FFmpeg入门详解之16:音频编码原理
  • 原文地址:https://blog.csdn.net/xieedeni/article/details/137078952