打造灵活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.xdnf.cn/news/1544608.html

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

相关文章

下载与安装|Inventor 2025百度云资源分享附教程

如大家所了解的&#xff0c;Inventor是一款专业的三维可视化实体建模软件&#xff0c;主要用于各类二维机械制图、三维制图的设计和开发等操作&#xff0c;可以广泛地应用于零件设计、钣金设计、装配设计等领域。 不同领域的应用证明了Inventor具有强大的兼容性&#xff0c;基…

监控易监测对象及指标之:全面监控Oracle ODBC数据库

在数字化时代&#xff0c;数据库作为存储和管理企业核心数据的基石&#xff0c;其稳定性和性能直接关系到业务的连续性和效率。Oracle数据库以其强大的功能和稳定性&#xff0c;广泛应用于各行各业。为了确保Oracle数据库的稳定运行和高效性能&#xff0c;对其进行全面监控显得…

备战软考Day04-计算机网络

1、计算机网络的分类 2、七层网络体系结构 3、网络的设备与标准 4、TCP/IP协议族 TCP/IP作为Internet的核心协议&#xff0c;被广泛应用于局域网和广域网中&#xff0c;目前已成为事实上的国际标准 1、TCP/IP分层模型 TCP/IP协议是Internet的基础和核心&#xff0c;和OSI参考…

git命令将已经commit的代码push到其他分支

文章目录 一&#xff1a;对于多分支的代码库&#xff0c;将提交记录从一个分支转移到另一个分支是常见需求方法1&#xff1a;撤销commit操作方法2&#xff1a;实用命令git cherry-pick 来移动commit 二、不小心revert导致代码消失的问题 一&#xff1a;对于多分支的代码库&…

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要&#xff1a; 近年来&#xff0c;去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能&#xff0c;去噪扩散模…

好用的todolist待办清单软件下载推荐

在快节奏的现代生活中&#xff0c;时间管理变得尤为重要。todolist待办清单管理软件&#xff0c;作为一种高效的任务管理工具&#xff0c;它帮助我们记录、跟踪和管理日常任务&#xff0c;从而提升个人效率。 在众多的待办软件中&#xff0c;敬业签以其出色的用户体验脱颖而出…

Vue2电商项目(四) Detail模块

文章目录 一、配置Detail路由1. 将Detail组件配置为路由组件2. 将路由配置文件拆分3. 声明式导航跳转到Detail跳转时存在的问题&#xff1a;页面滚动条还在下边 二、配置API及vuex三、放大镜及下方轮播图1. Detail组件传递放大镜数据2. 读取vuex数据的经典错误undefined3. 放大…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&…

【集合拆分+多线程并行处理,拿来即用】

文章目录 一.业务场景二.拆分流程三. 简单上个List拆分的demo四.测试结果五.小结 一.业务场景 节假日后第一天&#xff0c;上完班有点累&#xff0c;回到家稍微写点简单的东西。 我们项目里面有这样一业务场景&#xff0c;要计算全公司所有人某几个月内每天的考勤机打卡加班工时…

docker从0到1运行mysql(最详细且绝对成功版)

前置环境 CentOS7.8 安装docker yum install -y docker 启动docker并检查docker状态 systemctl start docker systemctl status docker 这样即正常 设置镜像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值 vim /etc/docker/daemon.json …

set的使用

序列式容器和关联式容器 序列式容器&#xff1a; 前⾯我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间…

监控和维护 Linux 系统的健康状态:从服务启动故障到操作系统查询

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务&#xff0c;因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数&#xff1a; -d 将 Ntopng 进程放入后台执行。默认情况下&#xff0c;Ntop 在前台运行。 -u 指定启动Ntopng执行的用户&#xff0c;默认为…

C++ SLT标准模板简介

STL全称是standard template libaray 标准模板库&#xff0c;这个库是C库中十分重要的一部分&#xff0c;里面涵盖可复用的组件库&#xff0c;而且是一个包罗了数据结构与算法的软件框架。 STL各主要版本 stl库最初是由Alexander Stepanov、Meng Lee在惠普工作室中完成的原始…

Multisim简体中文版百度云下载(含安装步骤)

如大家所熟悉的&#xff0c;Multisim是一款基于电路仿真的软件&#xff0c;可用于电子工程师、电子爱好者和学生进行电路设计、分析和调试。Multisim具有完整的电路设计和仿真功能&#xff0c;可支持模拟电路、数字电路&#xff0c;以及混合电路。 Multisim可以模拟不同电路的…

基于vue框架的大参林药品信息管理系统的设计与实现8b4gt(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,药品分类,药品信息,医生 开题报告内容 基于Vue框架的大参林药品信息管理系统的设计与实现开题报告 一、引言 随着医疗健康行业的快速发展和信息化浪潮的推进&#xff0c;药品信息管理已成为提升医疗服务效率、保障患者用药安全、…

怎样摆脱繁重的“物理集中”,轻松连接与交付全域数据,真正实现“敏捷用数”?

Data Fabric&#xff08;数据编织&#xff09;&#xff0c;作为新一代的数据管理策略&#xff0c;其核心在于通过逻辑层面的数据整合与加工&#xff0c;打破物理集中的局限&#xff0c;实现数据的无缝共享与高效利用。以往&#xff0c;我们更多地从理论层面探讨数据编织的技术与…

RK3229 MS8416 MS8406调试

1、I2S做从机模式&#xff0c;音频芯片做主模式 由于音频芯片做从模式声音可能会失真&#xff0c;所以必须使得I2S1做从模式&#xff0c;音频芯片做主模式 ms84x6 {compatible "rockchip,ms84x6";pinctrl-0 <&lk_ms84x6_io>;//ms84x6_sda <&gpi…

目标检测系列(三)yolov2的全面讲解

YOLOv2&#xff08;论文原名《YOLO9000: Better, Faster, Stronger》&#xff09;作为该系列的第二个版本&#xff0c;对原始YOLO进行了显著的改进&#xff0c;进一步提高了检测速度和准确度。在精度上利用一些列训练技巧&#xff0c;在速度上应用了新的网络模型DarkNet19&…

小阿轩yx-Ansible部署与应用基础

小阿轩yx-Ansible部署与应用基础 前言 由于互联网的快速发展导致产品更新换代速度逐步增长&#xff0c;运维人员每天都要进行大量的维护操作&#xff0c;按照传统方式进行维护使得工作效率低下。这时部署自动化运维就可以尽可能安全、高效的完成这些工作。 Ansible 概述 什…