打造灵活DateTimePicker日期时间选择器组件:轻松实现时间的独立清除功能

element ui中日期和时间选择器(DateTimePicker)是一个常见且重要的组件。它允许用户轻松地选择日期和时间,极大地提升了用户体验。然而,在某些场景下,用户可能需要更细粒度的控制,例如单独清除已选择的时间而保留日期。效果如下图,本文将带领你一步步封装一个DateTimePicker组件,实现时间的独立清除功能。

 实现步骤

1、在components中新建组件dataTimePicker

<template><el-date-picker:popper-class="uniqueId"style="margin-left: 5px"type="datetime"v-model="dataTimeValue":placeholder="placeholder"@change="changeDateTime"@focus="onFocus"></el-date-picker>
</template>

1、1给每个组件自定义一个唯一的下拉框class名 

 data() {return {dataTimeValue: "", // 初始化值uniqueId: `date-picker-${Math.random().toString(36).substring(2, 15)}`, // 生成一个唯一的IDisAddCloseIcon: false,};},

1.2 该组件接收两个props

  props: {timeValue: {type: Date, // 初始展示时间required: false,},placeholder: {type: String,require: false,default: "起始时间",},},

1.3 在 onFocus事件中,添加清除图标,因为只有当onFocus触发时,下拉框才显示,才能获取到下拉框dom

onFocus() {if (this.isAddCloseIcon) return; // 避免重复添加this.$nextTick(() => {this.timeDiv = document.querySelectorAll(`.${this.uniqueId} .el-date-picker__editor-wrap .el-input`,this.$el)[1];this.span = document.createElement("span");this.span.innerHTML = `<i class="el-icon-circle-close"></i>`;this.span.style.position = "absolute";this.span.style.right = "10px";this.span.style.cursor = "pointer";this.span.style.display = "none"; // 初始时隐藏spanthis.timeDiv.appendChild(this.span);// 鼠标移入事件this.timeDiv.addEventListener("mouseenter",this.handleMouseenter);// 鼠标移出事件this.timeDiv.addEventListener("mouseleave", this.handleMouseLeave);// 点击事件,清除时间置为00:00:00this.span.addEventListener("click", this.clearDateTimeValue);this.isAddCloseIcon = true;});},

1.4  清除时间事件以及鼠标移入显示图标移除隐藏图标:

 clearDateTimeValue() {this.dataTimeValue = this.$moment(this.dataTimeValue).startOf("day").toISOString();},handleMouseLeave() {this.span.style.display = "none";},handleMouseenter() {this.span.style.display = "inline";}

1.5 时间变化时通知父组件:

changeDateTime(value) {this.dataTimeValue = value;this.$emit("change", value);},

1.6 组件销毁时,移除监听事件:

 beforeDestroy() {// 组件销毁前清理事件监听器this.span.removeEventListener('click',this.clearDateTimeValue)this.timeDiv.removeEventListener('mouseenter',this.handleMouseenter)this.timeDiv.removeEventListener('mouseleave',this.handleMouseLeave)this.span = nullthis.timeDiv = null},

完整代码:

dataTimePicker.vue:

<template><el-date-picker:popper-class="uniqueId"style="margin-left: 5px"type="datetime"v-model="dataTimeValue":placeholder="placeholder"@change="changeDateTime"@focus="onFocus"></el-date-picker>
</template><script>
export default {props: {timeValue: {type: Date,required: false,},placeholder: {type: String,require: false,default: "起始时间",},},data() {return {dataTimeValue: "", // 初始化值uniqueId: `date-picker-${Math.random().toString(36).substring(2, 15)}`, // 生成一个唯一的IDisAddCloseIcon: false,};},mounted() {this.dataTimeValue = this.timeValue;},methods: {changeDateTime(value) {this.dataTimeValue = value;this.$emit("change", value);},onFocus() {if (this.isAddCloseIcon) return; // 避免重复添加this.$nextTick(() => {this.timeDiv = document.querySelectorAll(`.${this.uniqueId} .el-date-picker__editor-wrap .el-input`,this.$el)[1];this.span = document.createElement("span");this.span.innerHTML = `<i class="el-icon-circle-close"></i>`;this.span.style.position = "absolute";this.span.style.right = "10px";this.span.style.cursor = "pointer";this.span.style.display = "none"; // 初始时隐藏spanthis.timeDiv.appendChild(this.span);// 鼠标移入事件this.timeDiv.addEventListener("mouseenter",this.handleMouseenter);// 鼠标移出事件this.timeDiv.addEventListener("mouseleave", this.handleMouseLeave);this.span.addEventListener("click", this.clearDateTimeValue);this.isAddCloseIcon = true;});},clearDateTimeValue() {this.dataTimeValue = this.$moment(this.dataTimeValue).startOf("day").toISOString();},handleMouseLeave() {this.span.style.display = "none";},handleMouseenter() {this.span.style.display = "inline";}},beforeDestroy() {// 组件销毁前清理事件监听器this.span.removeEventListener('click',this.clearDateTimeValue)this.timeDiv.removeEventListener('mouseenter',this.handleMouseenter)this.timeDiv.removeEventListener('mouseleave',this.handleMouseLeave)this.span = nullthis.timeDiv = null},
};
</script>

2、在父组件引入:

<template>
<dateTimePicker :timeValue="startTime"  @change="changeDateTime"></dateTimePicker>
</template>
<script type="text/ecmascript-6">
import dateTimePicker from '@/components/dataTimePicker.vue'
export default {
...,methods: {changeDateTime(value) {console.log('变化',value)
}
}
</script>

3、总结

通过以上方法,我们可以实现在不改变日期的情况下单独清除时间功能,实际上就是在element ui原本的el-date-picker组件上进行改装,增加一个清除按钮并绑定清除事件来实现。实际应用中,你可以根据具体需求进一步扩展和定制这个组件,以满足不同场景下的使用。希望这篇文章能对你有所帮助!

 

 

 

 

 

 

 

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

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

相关文章

Swagger 概念和使用以及遇到的问题

前言 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变 成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经常出现无法及时更新&#xff0c; 导致前端人员抱怨接口文档和实际情况不一致。 很多人员会抱怨别人写的接口文档不…

Cassandra 5.0 Spring Boot 3.3 CRUD

概览 因AI要使用到向量存储&#xff0c;JanusGraph也使用到Cassandra 卸载先前版本 docker stop cassandra && docker remove cassandra && rm -rf cassandra/运行Cassandra容器 docker run \--name cassandra \--hostname cassandra \-p 9042:9042 \--pri…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库&#xff0c;方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作&#xff0c;包括 Windows、Linux 和 macOS&#xff0c;以及在 .NET Core 和 .NET Framework 上运行。 解码…

硬件看门狗导致MCU启动时间慢

最近&#xff0c;在项目交付过程中&#xff0c;我们遇到了一个有趣的问题&#xff0c;与大家分享一下。 客户的需求是&#xff1a;在KL15电压上电后&#xff0c;MCU需要在200ms内发送出第一包CAN报文数据。然而&#xff0c;实际测试结果显示&#xff0c;软件需要360ms才能发送…

【通俗易懂介绍OAuth2.0协议以及4种授权模式】

文章目录 一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1 介绍1.2 适用场景1.3 时序图 2.密码模式2.1 介绍2.2 适用场景2.3时序图 3.授权码模式3.1 介绍3.2 适用场景3.3 时序图 4.简化模式4.1 …

MES系统如何提升制造企业的运营效率和灵活性

参考拓展&#xff1a;苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

OpenAI o1团队突破性论文:『过程推理』中数学推理能力大幅提升,从正确中学习的新方法

原创 超 近年来&#xff0c;大型语言模型(LLMs)在复杂的多步推理任务中取得了令人瞩目的进展。这些模型能够生成逐步的思维链&#xff0c;解决从小学数学到高等微积分的各种问题。然而&#xff0c;即使是最先进的模型也常常陷入逻辑陷阱&#xff0c;产生看似合理但实际错误的推…

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型&#xff0c;本章从分布…

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel class TimeListModel : public QAbstrac…

STM32CUBEIDE FreeRTOS操作教程(五):mutex互斥信号量

STM32CUBEIDE FreeRTOS操作教程&#xff08;五&#xff09;&#xff1a;mutex互斥信号量 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&am…

蓝牙技术|详谈蓝牙信道探测技术,可实现厘米级精准定位

2024年9月5日&#xff0c;蓝牙技术联盟发布蓝牙6.0核心规范。相比此前各版本&#xff0c;蓝牙核心规范6.0版的主要创新和新功能包括&#xff1a;支持蓝牙信道探测、同步适配层增强、LL扩展功能和 帧空间更新。 蓝牙信道探测 市场上已经有不少高精度定位技术了&#xff0c;像 …

ToF传感器更新

我们最近改进了 ToF 解码管道&#xff08;固件&#xff09;和 ToF 工厂校准&#xff0c;该校准已应用于我们最新的带有 ToF 相机的OAK-D-SR-PoE 1. 点云 这是直接来自摄像机的原始点云&#xff08;没有应用任何后处理过滤器&#xff09;。 2. ToF 精度 &#xff08;ToF 深度误差…

界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for WinForms在今年第一…

3d可视化图片:通过原图和深度图实现

1、depthy 在线体验demo: https://depthy.stamina.pl/#/ 也可以docker安装上面服务: docker run --rm -t -i -p 9000:9000 ndahlquist/depthy http://localhost:90001)首先传原图 2)再传对应深度图 3)效果 </ifra

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

分布式系统的概念与设计模式

概念 定义&#xff1a;分布式系统是指将数据和计算任务分散到多个独立的计算机上&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同对外提供服务。分布式系统不仅提高了系统的可靠性和可扩展性&#xff0c;还增强了系统的并发处理能力和数据管理能力。 特点&…

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…