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

news/2024/12/21 22:05:32/

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.ppmy.cn/news/1534326.html

相关文章

git如何将多个提交合并为一个提交

目录 第一种&#xff1a;使用git rebase命令 第二种&#xff1a;使用git reset命令 重新提交 第一种&#xff1a;使用git rebase命令 使用以下命令的其中一种启动交互式 rebase git rebase -i 你想要合并提交的父提交的哈希值git rebase -i <commit-hash>^ &#…

实战4、爬取淘宝商品数据-selenium模拟

1、登录 在页面中找到登录按键&#xff0c;使用selenium模拟点击 button_login wd.find_element(By.XPATH,"//li[idJ_SiteNavMytaobao]/div[classsite-nav-menu-hd]/a[target_top]")button_login.click()找到用户名密码所在位置模拟输入 # 模拟输入账密button_us…

正向代理与反向代理:原理、区别以及应用(Nginx 和 Tomcat)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 实现原理正向代理工作流程&#xff1a; 反向代理工作流程&#xff1a; 区别 2. 使用案例Nginx作为正向代理Nginx作为反向代理Tomcat作为反向代理 3. 适用场景…

C#绘制动态曲线

前言 用于实时显示数据动态曲线&#xff0c;比如&#xff1a;SOC。 //用于绘制动态曲线&#xff0c;可置于定时函数中&#xff0c;定时更新数据曲线 void DrawSocGraph() {double f (double)MainForm.readData[12]; //display datachart1.Series[0].Points.Add(f);if (ch…

影视cms泛目录用什么程序?苹果cms二次开发泛目录插件

影视CMS泛目录一般使用的程序有很多种&#xff0c;&#xff08;maccmscn&#xff09;以下是其中几种常见的程序&#xff1a; WordPress&#xff1a;WordPress是一个非常流行的开源内容管理系统&#xff0c;可以通过安装一些插件来实现影视CMS泛目录功能。其中&#xff0c;一款常…

高性能防静电主轴4033 AC-ESD 在线路板切割中的非凡表现

随着电子产品的日益小型化/集成化&#xff0c;线路板的制造也面临着更高的挑战。线路板分板作为电子制造流程中的关键环节&#xff0c;其效率和精度直接影响到最终产品的质量和市场竞争力。因此专用的高性能防静电主轴SycoTec 4033 AC-ESD凭借其卓越的性能&#xff0c;成为众多…

python 人工智能 机器学习 当损失函数的数值变成 `nan` 时,这通常意味着在模型训练过程中出现了数值不稳定性以及解决办法,数据分析

当损失函数的数值变成 nan 时&#xff0c;这通常意味着在模型训练过程中出现了数值不稳定性。以下是一些可能导致这个问题的原因以及相应的解决方法&#xff1a; 1. **学习率过高**&#xff1a;如果学习率设置得过高&#xff0c;可能会导致梯度爆炸&#xff0c;从而导致损失函…

uniapp学习(003-1 vue3学习 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第11p-第p14的内容 文章目录 vue3使用介绍插值表达式例子时间戳随机数输出函数的值 ref响应式数据变量v-bind 绑…