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

element ui

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

写在前面

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

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

<template><div class="date-input"><el-inputv-model="startDateStr":placeholder="$t('task.taskStartTime')"type="text"clearableclass="date-input-field"@input="validateDate"/><span class="line"></span><el-inputv-model="endDateStr":placeholder="$t('task.taskFinishTime')"type="text"clearableclass="date-input-field"@blur="validateDate"/><div class="icon-container" @click="toggleDatePicker"><i class="el-icon-date" style="font-size: 24px;"></i></div><el-date-pickerstyle="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.rhkb.cn/news/437398.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【经典机器学习算法】谱聚类算法及其实现(python)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 前…

模版and初识vector

一、引言 在C语言中&#xff0c;不论是数组&#xff0c;还是结构体定义的数组&#xff0c;功能都比较欠缺&#xff0c;不是单纯的添加几个变量就能够解决的。缺少增删查改的功能&#xff0c;为了解决这个问题&#xff0c;C决定填上C语言这个坑&#xff0c;但是填过坑的人都知道…

线性DP之最长上升/下降子序列

分析过程&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #include<unordered_map> #include<unordered_set> using namespace std; #define int long long //可能会超时 #define PII pair<int,int> const int INF 0x3f3f3f3f, mod 99824435…

认知杂谈73《成年人的修炼:勇敢前行,积极向上》

内容摘要&#xff1a; 成长是成年人的必修课&#xff0c;它要求我们不断学习、面对挑战、做出选择、调整行动。成长的必要性在于适应社会、实现自我价值。实现成长的策略包括自我掌舵、自救、为结果负责、保持积极心态。 追求艺术或商业目标、自己解决问题、承担责任、换个角度…

Android 车载虚拟化底层技术-显示虚拟化(双card)总览

系列文章请扫关注公众号&#xff01; 本文主要包括部分&#xff1a; 显示虚拟化场景DRM架构 2.1 DRM简介&#xff08;Direct Rendering Manager&#xff09; 2.2 高通SDM驱动 Multiple-drm-cards方案 3.1 介绍 3.2 Qcom驱动框架解析 3.3 高通及MTK平台支持情况 3.4 方案…

针对考研的C语言学习(定制化快速掌握重点2)

1.C语言中字符与字符串的比较方法 在C语言中&#xff0c;单字符可以用进行比较也可以用 > , < ,但是字符串却不能用直接比较&#xff0c;需要用strcmp函数。 strcmp 函数的原型定义在 <string.h> 头文件中&#xff0c;其定义如下&#xff1a; int strcmp(const …

基于深度学习的乳腺癌分类识别与诊断系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 乳腺癌是全球最常见的癌症之一&#xff0c;早期诊断对于治疗效果至关重要。近年来&#xff0c;深度学习技术在医学图像分析领域取得了显著进展&#xff0c;能够从大量的医学影像数据中自动学习和提…

TiDB 在线打标签实现副本调度应用实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/4e14596a 案例背景 某原有系统为虚拟机环境部署&#xff0c;整体性能不满足预期。为提升集群整体性能&#xff0c;计划分阶段采购物理机&#xff0c;并以扩缩容的方式逐渐把物理机添加到…

uniapp踩坑 tabbar页面数据刷新了但视图没有更新

问题描述&#xff1a; 有个uni-data-checkbox组件&#xff0c;两个选项&#xff1a;选项1和选项2&#xff08;对应的value值分别为1和2&#xff09;&#xff0c;v-model绑定属性名为value 两个tabbar页面&#xff1a;tab1&#xff0c;tab2。 tab1页面有个逻辑是在onShow中刷新v…

IDEA 设置自动定位文件

一、场景分析 IDEA 在使用的过程中&#xff0c;发现有时候&#xff0c;打开一个类&#xff0c;它并不能自动帮我们在左侧 Project 树中定位出文件&#xff0c;需要自己手动点击 瞄准 图标。很不方便。 二、解决方法 1、点击 瞄准 图标旁边的 竖三点 2、将 Alwasy Select Opene…

Kubernetes云原生存储解决方案之 Rook Ceph实践探究

Kubernetes云原生存储解决方案之 Rook Ceph实践探究 除了手动部署独立的 Ceph 集群并配置与Kubernetes进行对接外&#xff0c;Rook Ceph 支持直接在 Kubernetes 集群上部署 Ceph 集群。 通过Rook Ceph云原生存储编排平台&#xff0c;使得 Kubernetes 集群中启用高可用的 Ceph…

text2sql方法:NatSQL和DIN-SQL

NatSQL NatSQL出自2021年9月的论文《Natural SQL: Making SQL Easier to Infer from Natural Language Specifications》(github)&#xff0c;它是一种SQL 中间表征(SQL intermediate representation(IR))方法。 NatSQL作者认为Text2SQL的关键挑战是自然语言描述和其对应的SQ…

数据结构——“AVL树”的四种数据旋转的方法

因为上次普通的二叉搜索树在极端情况下极容易造成我们的链式结构&#xff08;这会导致我们查询的时间复杂度变为O(n)&#xff09;&#xff0c;然而AVL树就很好的解决了这一问题&#xff08;归功于四种旋转的方法&#xff09;&#xff0c;它让我们的树的查询的时间复杂度变得接近…

Dapper 如何确保数据的安全性和防止 SQL 注入攻击?

一、什么是SQL注入攻击 SQL注入攻击是一种常见的网络攻击手段&#xff0c;它利用了应用程序中安全措施不足的问题&#xff0c;允许攻击者插入或“注入”一个或多个SQL语句到原本的查询中。这种攻击可以用于获取、篡改或删除数据库中的数据&#xff0c;甚至可以执行一些数据库管…

【web安全】——sql注入

1.MySQL基础 1.1information_schema数据库详解 简介&#xff1a; 在mysql5版本以后&#xff0c;为了方便管理&#xff0c;默认定义了information_schema数据库&#xff0c;用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…

字节豆包C++一面-面经总结

talk is cheap show me the code lc206&#xff1a;链表反转&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {if(headnullptr||!head->next)return head…

sentinel原理源码分析系列(二)-动态规则和transport

本文是sentinel原理源码分析系列第二篇&#xff0c;分析两个组件&#xff0c;动态配置和transport 动态规则 Sentinel提供动态规则机制&#xff0c;依赖配置中心&#xff0c;如nacos&#xff0c;zookeeper&#xff0c;组件支持动态配置&#xff0c;模板类型为规则&#xff0c;支…

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作&#xff1a; 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制&#xff0c;有时候不想看到这个烦人的切换按钮&#xff0c;可以设置usesScrollButtons为假&#xff0c;其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…

python调用opencv报错“module ‘cv2‘ has no attribute ‘namedWindow‘”

之前电脑上使用pip install安装过opencv相关的python模块&#xff0c;不过后续学习opencv时主要使用OpenCVSharp在VS2022中创建项目测试。今天学习过程中突然想用python试试&#xff0c;不过运行下面代码时报错“module ‘cv2’ has no attribute namedWindow”。 import cv2c…

巡检机器人室内配电室应用

智能巡检系统实施背景 电力系统发展已进入电气化、自动化、智能化建设加速推进的新阶段&#xff0c;设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0c;装备水平取得长足发展&#xff0c;与此同时设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0…