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

news2024/12/23 22:52:08

1.需求场景

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

2.组件代码MyDateTimeChange.vue

<template>
  <el-date-picker
    v-model="internalValue"
    :default-time="['00:00:00', '23:59:59']"
    size="small"
    :style="{width:width,height:height}"
    type="datetimerange"
    range-separator="-"
    :start-placeholder="$t('datepicker.startDate')"
    :end-placeholder="$t('datepicker.endDate')"
    :picker-options="pickerOptions"
    :value-format="customFormat"
    :format="format"
    :clearable="clearable"
    @change="dateChanged"
  ></el-date-picker>
</template>

<script>


export default {

  name: "MyDateChange",
  props: {
    width: {
      type: String,
      default: ''
    },
    height:{
      type:String,
      default:'41px'
    },
    customFormat:{
      type:String,
      default: 'yyyy-MM-dd'
    },
    value:{
      type:Array,
    },
    format:{
      type:String,
      default: 'yyyy-MM-dd'
    },
    clearable: {
      type: Boolean,
      default: false
    },
  },
  data() {
    const _this = this
    return {
      pickerOptions: {
        shortcuts: [{
          text: this.$t('datepicker.today'),
          onClick(picker) {
            const start = _this.getFirstTime(new Date());
            const end = _this.getEndTime(new Date());
            //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', [start, end]);
          }
        },
          {
            text: this.$t('datepicker.thisWeek'),
            onClick: (picker) => {
              const start = _this.getFirstTime(this.getStartOfWeek());
              const end = _this.getEndTime(new Date());
              //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', [start, end]);
            }
          }, {
            text: this.$t('datepicker.thisMonth'),
            onClick: (picker) => {
              const start = _this.getFirstTime(this.getStartOfMonth());
              const end = _this.getEndTime(new Date());
              //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: this.$t('datepicker.thisYear'),
            onClick: (picker) => {
              const start = _this.getFirstTime(this.getFirstDayOfYear());
              const end = _this.getEndTime(new Date());
              //start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: this.$t('datepicker.recentSeven'),
            onClick(picker) {
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              _this.getFirstTime(start);
              const end = _this.getEndTime(new Date());
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: this.$t('datepicker.recentFifteen'),
            onClick(picker) {
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 15);
              _this.getFirstTime(start);
              const end = _this.getEndTime(new Date());
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: this.$t('datepicker.recentThirty'),
            onClick(picker) {
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              _this.getFirstTime(start);
              const end = _this.getEndTime(new Date());
              picker.$emit('pick', [start, end]);
            }
          }
        ]
      },
      dateRange: '',
      submitButtonLoading: false,
      internalValue:this.value
    };

  },
  watch:{
    value: {
      handler(val) {
        this.$set(this,"internalValue",val);
        return val
      }
    }
  },

  methods: {
    getFirstTime(day){
      day.setHours(0);
      day.setMinutes(0);
      day.setSeconds(0);
      day.setMilliseconds(0);
      return day;
    },
    getEndTime(day){
      day.setHours(23);
      day.setMinutes(59);
      day.setSeconds(59);
      day.setMilliseconds(999);
      return day;
    },
    getStartOfWeek() {
      let today = new Date();
      let day = today.getDay(); // 获取今天是星期几 (0 是周日,1 是周一,以此类推)
      let startOfWeek = new Date(today); // 复制今天的日期
      // 将日期设置为本周的第一天 (星期日)
      startOfWeek.setDate(today.getDate() - day);
      return startOfWeek;
    },
    getStartOfMonth() {
      const today = new Date();
      const year = today.getFullYear();
      const month = today.getMonth(); // 获取当前月份,注意月份是从 0 开始的(0 表示一月)
      // 设置日期为本月的第一天
      const firstDay = new Date(year, month, 1);
      return firstDay;
    },
    getFirstDayOfYear() {
      const today = new Date();
      const year = today.getFullYear();
      // 设置日期为今年的第一天
      const firstDayOfYear = new Date(year, 0, 1); // 月份从0开始,0表示一月
      return firstDayOfYear;
    },
    dateChanged(newDate) {
      this.internalValue = newDate; // 更新内部数据
      this.$emit('input', newDate); // 触发父组件的更新
    }
  },


};

</script>
<style lang="css">
/*去掉了选择日期时间页面的分和秒*/
.el-time-spinner__wrapper{
  width: 100% !important;
}
.el-scrollbar:nth-of-type(2){
  display: none;
}
/*去掉了选择日期时间页面的清空按钮*/
.el-picker-panel__footer .el-picker-panel__link-btn.el-button--text  {
  display: none;
}
</style>

3.使用

import MyDateTimeChange from "@/components/xxx/MyDateTimeChange";

......
<el-form-item :label="$t('OpenapiLogStatistics.time')">
        <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>
      </el-form-item>
......

data() {
    return {
              dateRange: [getNowFormatDate("-")+' 00:00:00',getNowFormatDate("-")+' 23:59:59'],

    }
}

......
// 添加日期范围
export function addDateRange(params, dateRange, propName) {
	let search = params;
	search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
	dateRange = Array.isArray(dateRange) ? dateRange : [];
	if (typeof (propName) === 'undefined') {
		search.params['beginTime'] = dateRange[0];
		search.params['endTime'] = dateRange[1];
	} else {
		search.params['begin' + propName] = dateRange[0];
		search.params['end' + propName] = dateRange[1];
	}
	return search;
}

/**
 * 默认生成日期格式 yyyyMMdd
 * @param seperator1 分隔符
 * @returns 返回日期字符串
 */
export function getNowFormatDate(seperator1) {
  seperator1 = seperator1||''
  let date = new Date();
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let strDate = date.getDate();
  if (month >= 1 && month <= 9) {
    month = "0" + month;
  }
  if (strDate >= 0 && strDate <= 9) {
    strDate = "0" + strDate;
  }

  return year + seperator1 + month + seperator1 + strDate;
}

......

methods:{
    getQueryParams() {
      if (this.dateRange) {
        return this.addDateRange(this.queryParams, this.dateRange)
      }
      this.queryParams.params=[];
      return this.queryParams;
    },


}

4.效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ESP32S3 Sense接入语音识别+MiniMax模型对话】

1. 前言 围绕ESP32S3 Sense接入语音识别MiniMax模型对话展开&#xff0c;首先串口输入“1”字符&#xff0c;随后麦克风采集2s声音数据&#xff0c;对接百度在线语音识别&#xff0c;将返回文本结果丢入MiniMax模型&#xff0c;进而返回第二次结果文本&#xff0c;实现语言对话…

Linux 系统 docker搭建LNMP环境

1、安装nginx docker pull nginx (默认安装的是最新版本) 2、运行nginx docker run --name nginx -p 80:80 -d nginx:latest 备注&#xff1a;--name nginx 表示容器名为 nginx -d 表示后台运行 -p 80:80 表示把本地80端口绑定到Nginx服务端的 80端口 nginx:lates…

【问题分析】InputDispatcher无焦点窗口ANR问题【Android 14】

1 问题描述 Monkey跑出的无焦点窗口的ANR问题。 特点&#xff1a; 1&#xff09;、上层WMS有焦点窗口&#xff0c;为Launcher。 2&#xff09;、native层InputDispacher无焦点窗口&#xff0c;上层为”recents_animation_input_consumer“请求了焦点&#xff0c;但是”rece…

国赛大纲解读

1. 第一部分,是针对5G基础知识的掌握,第二部分是人工智能基本算法的掌握,就是人工智能的应用,用5G+人工智能(AI算法)进行网络优化的问题,要有网络优化的基础知识,比如说:某个区域的覆盖问题,覆盖特别差,但有数据,覆盖电频,srp值这些数据给你,根据数据来判断是…

OCP NVME SSD规范解读-15.DSSD set feature功能要求-1

4.15.2 DSSD Set Feature Requirements章节重点描述了针对数据中心NVMe SSD&#xff08;DSSD&#xff09;特有的设置特性要求。在NVMe SSD规范中&#xff0c;通过Set Feature命令可以对SSD进行各种高级功能的设置和配置&#xff0c;DSSD特有的Set Feature命令集中了一些特定于D…

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后&#xff0c;感觉UDP就像是初入职场的年轻人&#xff0c;两耳不闻 “窗外事”&#xff0c;只管尽力地把自己的事情做好&#xff0c;但收获的却是不可靠&#xff0c;而TCP更像是涉世极深的"职场老油条"&#xff0c;给人的感觉就是 “城府极深&a…

被迫走上前端之路第四课之vue的表单双向绑定

在进行表单处理时&#xff0c;我们希望JavaScript中与表单绑定的变量能随着我们表单的输入或选择而动态的发生改变&#xff0c;或者说二者同步。这个时候就需要实现表单的双向绑定 使用v-on和v-bind实现 这里定义了一个输入框&#xff0c;v-bind实现了text的值到输入框的值的绑…

QT中的服务器与客户端

一、前言 本文主要讲讲QT中服务器与客户端的使用方法&#xff0c;QT已经封装好了&#xff0c;调用相应类直接访问即可。本文以QT中的QT中的TCP为例子&#xff0c;讲下使用方法以及线程中使用。 二、正文 2.1 Sever的使用方法 2.1.1 思路 QT中Sever使用的时候大致步骤为&…

Python抓取抖音直播间数据:技术探索与实践

目录 一、引言 二、技术准备 三、分析抖音直播间网页结构 四、编写爬虫代码 五、处理反爬虫机制 六、数据清洗与存储 七、总结 一、引言 随着互联网的快速发展&#xff0c;直播行业已成为当下的热门领域。抖音作为其中的佼佼者&#xff0c;吸引了大量的用户和主播。对于…

集合系列(十五) -CopyOnWriteArrayList详解

一、摘要 在介绍 CopyOnWriteArrayList 之前&#xff0c;我们一起先来看看如下方法执行结果&#xff0c;代码内容如下&#xff1a; public static void main(String[] args) {List<String> list new ArrayList<String>();list.add("1");list.add(&quo…

Flutter 常用插件Plugin整理并附带实例

最近有点空闲时间&#xff0c;正好写一篇文章&#xff0c;整理一下我们在Flutter开发中常用的插件Plugin使用并附带上实例。 在日常开发中&#xff0c;整个demo目前应该满足大家所有的开发需求&#xff0c;例如&#xff1a;http请求、列表刷新及加载、列表分组、轮播图、视频播…

如何使用Python结合Pillow、matplotlib和OpenCV实现图片读取

使用Pillow库 matplotlib是一个绘图库&#xff0c;经常用于数据可视化&#xff0c;但它也可以用来展示图片。 from PIL import Image# 读取图片 image Image.open(.jpg)# 展示图片 image.show()使用OpenCV库 OpenCV是一个强大的计算机视觉和机器学习库。它不仅提供了大量的图像…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多&#xff1a; 其实在项目的开发中最有可能的错误就是①和②&#xff0c;考虑到本项目数组用的比较少&#xff0c;所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱&#xff0c;声音也算是一种设备&#xff1f;&#xff1f;&#xff…

Vue使用el-statistic和el-card显示大屏中的统计数据

​ 一、页面内容&#xff1a; <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…

机器人寻路算法双向A*(Bidirectional A*)算法的实现C++、Python、Matlab语言

机器人寻路算法双向A*&#xff08;Bidirectional A*&#xff09;算法的实现C、Python、Matlab语言 最近好久没更新&#xff0c;在搞华为的软件挑战赛&#xff08;软挑&#xff09;&#xff0c;好卷只能说。去年还能混进32强&#xff0c;今年就比较迷糊了&#xff0c;这东西对我…

JavaEE:网络原理——协议(应用层+传输层)

应用层 协议就是一种约定 应用层&#xff1a;对应应用程序&#xff0c;是程序员打交道最多的一层&#xff0c;调用系统提供的网络api写出的代码都是属于应用层的。应用层有很多现成的协议&#xff0c;但程序员一般用的还是自定义协议 自定义协议要约定好哪些内容&#xff1f…

【pytest、playwright】多账号同时操作

目录 方案实现思路&#xff1a; 方案一&#xff1a; 方案二&#xff1a; 方案实现思路&#xff1a; 依照上图所见&#xff0c;就知道&#xff0c;一个账号是pytest-playwright默认的环境&#xff0c;一个是 账号登录的环境 方案一&#xff1a; 直接上代码&#xff1a; imp…

Unity学习笔记 9.2D射线

下载源码 UnityPackage 1.Ray2D 让小球向右发射射线&#xff1a; Ray2D ray;void Start() {// Ray2D(起点&#xff0c;终点)ray new Ray2D(this.transform.position, Vector2.right);// Debug.DrawLine(起点&#xff0c;终点&#xff0c;颜色&#xff0c;显示时间)Debug.DrawL…

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

阿里云ECS选型推荐配置

本文介绍构建Kubernetes集群时该如何选择ECS类型以及选型的注意事项。 集群规格规划 目前在创建Kubernetes集群时&#xff0c;存在着使用很多小规格ECS的现象&#xff0c;这样做有以下弊端&#xff1a; 网络问题&#xff1a;小规格Worker ECS的网络资源受限。 容量问题&…