element-ui 通过按钮式触发日期选择器

news2024/12/22 9:41:50

element ui

  • 写在前面
  • 1. 自定义的日期时间组件CustomDatePicker.vue
  • 2. 页面效果
  • 总结
  • 写在最后

写在前面

需求:elementui中日期时间选择器,目前只能通过点击input输入框触发日期选择器,我希望能通过其他方式触发日期选择器同时把input输入框去掉,如点击按钮

1. 自定义的日期时间组件CustomDatePicker.vue

<template>
  <div class="date-input">
    <el-input
      v-model="startDateStr"
      :placeholder="$t('task.taskStartTime')"
      type="text"
      clearable
      class="date-input-field"
      @input="validateDate"
    />
    <span class="line"></span>
    <el-input
      v-model="endDateStr"
      :placeholder="$t('task.taskFinishTime')"
      type="text"
      clearable
      class="date-input-field"
      @blur="validateDate"
    />
    <div class="icon-container" @click="toggleDatePicker">
      <i class="el-icon-date" style="font-size: 24px;"></i>
    </div>
    <el-date-picker
      style="
        position: absolute;
        z-index: -100;
        top: 15px;
        left: -178px;
        transform: scale(0.1);
      "
      size="mini"
      v-model="selectedDateRange"
      :editable="false"
      type="datetimerange"
      @change="onDateChange"
      ref="timePick"
      value-format="yyyy-MM-dd HH:mm:ss"
    />
  </div>
</template>

<script>

export default {
  props: {
    // 父组件传过来的值  
    customTimePicker: {  
      type: Array,  
      default: () => {
              return [new Date(), new Date()]
            }  
    },  
  },
  data() {
    return {
      selectedDateRange: [],
      startDateStr: "",
      endDateStr: "",
      error: ''
    };
  },
  created(){
    console.log('====> customTimePicker', this.customTimePicker);
  },
  watch: {
    customTimePicker: {
      handler(newVal) {
        console.log('customTimePicker==>newVal', newVal);
        if (newVal && newVal.length === 2) {
          this.selectedDateRange = [...newVal];
          this.startDateStr = newVal[0];
          this.endDateStr = newVal[1];
        }
      },
      deep: true
    },
    selectedDateRange: {
      handler(newVal, oldVal) {
        if (newVal && newVal.length === 2) {
          if(oldVal && newVal.toString() === oldVal.toString()) {
            return;
          } else {
            this.startDateStr = newVal[0].toString().replace('T', ' ');
            this.endDateStr = newVal[1].toString().replace('T', ' ');
            this.$emit('input', newVal);
          }
        }
      },
      deep: true
    },
    startDateStr(newVal, oldVal) {
      if(oldVal && newVal.toString() === oldVal.toString()) {
        return;
      } else {
        this.selectedDateRange[0] = newVal.toString().replace('T', ' ');
        this.$emit('input', this.selectedDateRange);
      }
    },
    endDateStr(newVal, oldVal) {
      if(oldVal && newVal.toString() === oldVal.toString()) {
        return;
      } else {
        this.selectedDateRange[1] = newVal.toString().replace('T', ' ');
        this.$emit('input', this.selectedDateRange);
      }
    }
  },
  methods: {
    validateDate() {
      const value = this.startDateStr;
      if (value.trim() === '') {
        this.error = '';
        this.$emit('updateError', this.error);
        return;
      }

      // 验证格式
      const regex = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/;
      const match = value.match(regex);

      if (!match) {
        this.$message.error('Invalid date format. Please use yyyy-MM-dd HH:mm:ss.');
        //this.error = 'Correct format is yyyy-MM-dd HH:mm:ss';
        // this.$emit('updateError', this.error);
        return;
      }

      // 解析日期
      const [year, month, day, hours, minutes, seconds] = match.slice(1).map(Number);

      // 检查年份是否在合理范围内
      if (year < 1900 || year > 2100) {
        this.$message.error('Invalid year. Please enter a year between 1900 and 2100.');
        // this.error = 'please input valid year';
        // this.$emit('updateError', this.error);
        return;
      }

      // 检查月份是否在1到12之间
      if (month < 1 || month > 12) {
        this.$message.error('Invalid month. Please enter a month between 1 and 12.');
        // this.error = 'please input valid month';
        // this.$emit('updateError', this.error);
        return;
      }

      // 检查日期是否在1到当月的最大天数之间
      const daysInMonth = new Date(year, month, 0).getDate();
      if (day < 1 || day > daysInMonth) {
        this.$message.error('Invalid day. Please enter a day between 1 and the maximum number of days in the selected month.');
        // this.error = 'please input valid day';
        // this.$emit('updateError', this.error);
        return;
      }

       // 检查小时是否在0到23之间
       if (hours < 0 || hours > 23) {
        this.$message.error('Invalid hour. Please enter an hour between 0 and 23.');
        // this.error = 'please input valid hour';
        // this.$emit('updateError', this.error);
        return;
      }

      // 检查分钟是否在0到59之间
      if (minutes < 0 || minutes > 59) {
        this.$message.error('Invalid minute. Please enter a minute between 0 and 59.');
        // this.error = 'please input valid minute';
        // this.$emit('updateError', this.error);
        return;
      }

      // 检查秒是否在0到59之间
      if (seconds < 0 || seconds > 59) {
        this.$message.error('Invalid second. Please enter a second between 0 and 59.');
        // this.error = 'please input valid second';
        // this.$emit('updateError', this.error);
        return;
      }

      // 创建日期对象
      const date = new Date(year, month - 1, day, hours, minutes, seconds);

      // 检查日期是否有效
      if (isNaN(date.getTime())) {
        this.$message.error('Invalid date. Please enter a valid date.');
        // this.error = 'please input valid date';
        // this.$emit('updateError', this.error);
        return;
      }

      this.error = '';
      this.$emit('updateError', this.error);
    },
    toggleDatePicker() {
      //触发日期框展开
      //  document
      //     	.querySelector(".time-date-picker")
      //     	.querySelector("input")
      //     	.focus();
      this.$refs.timePick.focus();
    },
    onDateChange(date) {
      this.startDateStr = date[0];
      this.endDateStr = date[1];
      this.$set(this, 'selectedDateRange', [this.startDateStr, this.endDateStr])
      this.$emit('input', this.selectedDateRange);
    },
    
  },
};
</script>

<style scoped>
.date-input {
  display: flex;
  align-items: center;
  position: relative; /* 为绝对定位的日期选择器提供相对定位 */
}

.date-input-field {
  width: 18%;
  /* flex-grow: 1; /* 让输入框占满剩余空间 */
  /* margin: 0; /* 删除外边距 */
  z-index: 10;
}

.icon-container {
  display: flex;
  align-items: center;
  justify-content: center;
  /*width: 30px; /* 正方形框的宽度 */
  /*height: 30px; /* 正方形框的高度 */
  /*border: 1px solid #ccc; /* 正方形框的边框 */
  cursor: pointer;
  /*background-color: #f9f9f9; /* 可以选择性添加背景色 */

  background: transparent;
  color: #008ed0;
  /*border: 1px solid #008ed0;
}

.icon {
  font-size: 16px; /* 调整图标大小 */
  font-weight: bold; /* 粗体字 */
  margin: 0; /* 删除图标的外边距 */
}
/*
.timePickCSS {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 1000;
}
*/
.line {
  display: inline-block;
  width: 10px;
  height: 2px;
  background-color: #005987;
}
</style>

2. 页面效果

在这里插入图片描述

总结

写这篇博客主要的目的是让自己更深刻,有回忆点,然后就是分享自己的做法;有需要的根据自己的需求进行修改

写在最后

如果此文对您有所帮助,请帅戈靓女们务必不要吝啬你们的Zan,感谢!!不懂的可以在评论区评论,有空会及时回复。

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

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

相关文章

Spring的IOC和DI入门案例分析和实现

前言 IOC和DI是spring的核心之一&#xff0c;那我们为什么要使用spring技术呢&#xff1f;spring技术的优点在哪里&#xff1f; spring的特点&#xff1a; 简化开发&#xff0c;降低企业级开发的复杂性框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用的开发与…

【Python报错已解决】TypeError: ‘NoneType‘ object is not callable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【常读常悟】《大数据之路-阿里巴巴大数据实践》一书读书摘要

【常读常悟】《大数据之路-阿里巴巴大数据实践》一书读书摘要 1、背景2、目录结构3、数据加工链路4、章节摘要4.1 第2章 日志采集4.1.1 日志采集方案4.1.2 采集指标 4.2 第3章 数据同步4.2.1 数据的特点4.2.2 数据同步的三种方式4.2.3 数据同步的最佳实践 4.3 第4章 离线数据开…

LabVIEW自动生成NI-DAQmx代码

在现代数据采集和控制系统中&#xff0c;LabVIEW被广泛应用于各种工业和科研领域。其中&#xff0c;NI-DAQmx是一个强大的驱动程序&#xff0c;可以帮助用户高效地管理和配置数据采集任务。本文将介绍如何在LabVIEW中通过DAQ Assistant Express VI和任务常量自动生成NI-DAQmx代…

VBA字典与数组第十九讲:VBA中动态数组的定义及创建

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

【论文笔记】Visual Instruction Tuning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Instruction Tunin…

Linux线程(二)线程ID及创建线程详解

1.线程ID 就像每个进程都有一个进程 ID 一样&#xff0c;每个线程也有其对应的标识&#xff0c;称为线程 ID。进程 ID 在整个系统中是唯一的&#xff0c;但线程 ID 不同&#xff0c;线程 ID 只有在它所属的进程上下文中才有意义。 进程 ID 使用 pid_t 数据类型来表示&#xf…

【Linux进程间通信】Linux匿名管道详解:构建进程间通信的隐形桥梁

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux进程间通信 &#x1f4d2;1. 进程间通信介绍&#x1f4da;2. 什么是管道&#x1f4dc;3…

22.1 k8s不同role级别的服务发现

本节重点介绍 : 服务发现的应用3种采集的k8s服务发现role 容器基础资源指标 role :nodek8s服务组件指标 role :endpoint部署在pod中业务埋点指标 role :pod 服务发现的应用 所有组件将自身指标暴露在各自的服务端口上&#xff0c;prometheus通过pull过来拉取指标但是promet…

期权卖方如何选择铁矿石行权价?期权策略盈亏分析计算方式详解

截止9月30日收盘&#xff0c;铁矿石2411合约收盘价825元/吨。日线级别处于上涨趋势中 假设以825元为最新价&#xff0c;假设后市铁矿石期货价格会下跌&#xff0c;期权卖方应该如何选择行权&#xff1f; 卖出行权价800的看涨期权&#xff0c;期权报价37.9&#xff0c;一手权利…

【环境配置】科研小白Windows下安装Git

2024年小白使用Win10安装Git 2.46.2教程&#xff1a; 1 下载安装包 访问下载地址 Git - Downloading Package (git-scm.com) 下载之后打开文件 2 安装过程 点击Next 2.1 选择安装路径 2.2 选择勾选必要组件 2.3 一路Next 这一步直接Next即可 继续点击Next 继续点击Ne…

Linux学习之路 -- 线程 -- 线程池

前面介绍了条件变量的生产消费模型&#xff0c;下面介绍一下条件变量的另一个用法&#xff0c;那就是线程池。线程池的用法其实就是先创建一批线程&#xff0c;然后让这些线程从任务队列中取数据。具体就是生产消费者模型&#xff0c;(我的代码中生产线程只有一个并且生产的任务…

自动微分-梯度!

前言背景知识&#xff1a; 梯度下降(Gradient descent,GD) 正文&#xff1a; 自动微分为机器学习、深度学习神经网络的核心知识之一&#xff0c;若想更深一步使用神经网络进行具体问题研究&#xff0c;那么自动微分不得不了解。 “工欲善其事&#xff0c;必先利其器”&…

数据结构 ——— 单链表oj题:合并两个升序链表

目录 题目要求 手搓两个简易链表 代码实现 题目要求 将两个升序链表合并为一个新的升序链表并返回&#xff0c;新链表是通过拼接给定的两个链表的所有节点组成的 手搓两个简易链表 代码演示&#xff1a; struct ListNode* n1 (struct ListNode*)malloc(sizeof(struct …

【Linux】第一个小程序——进度条实现

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

【Python报错已解决】TypeError: ‘NoneType‘ object is not iterable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Android KMP 快速入门1 - 项目打包

这里写目录标题 KMP 运行与打包运行程序程序打包 KMP 运行与打包 运行程序 运行Android客户端&#xff0c;你首先需要把USB连接到物理机上&#xff0c;或者使用模拟器模拟一个手机&#xff1b; 然后选择运行配置的 composeApp &#xff0c;运行它即可 运行windows客户端&…

Qt/C++开源控件 自定义雷达控件

使用Qt框架创建一个简单的雷达图&#xff0c;包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写&#xff0c;适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…

解决银河麒麟操作系统V10软件包架构不符问题

TOC &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟桌面操作系统V10中安装软件包时&#xff0c;如果遇到“软件架构与本机架构不符”的提示&#xff0c;可以尝试以下步骤来解决问题&#xff1a; 1. 确认架构一致性 查看本机架构…