vue vue3 日期选择的组件,封装组件

一、背景

基于element日期选择组件,自行封装了一个组件。

以下是达到的效果:

1.选择年,日期选择组件默认填充是:当时的年;

2.选择月,日期选择组件默认填充的是:当时的年月;

3.选择日,日期选择组件默认填充的是:当时的年月日;

备注:

1.自行封装的组件,涉及到把所选的值暴露给其它“单页面组件”,通过vue3的defineExpose(),vue2需要修改一下;

2.自行封装的组件,涉及到传参,根据接口要求,传参了属性dataType;

3.自行封装的组件,涉及到判断条件,所选不能超过30天。

二、实现效果

三、代码

自行封装的组件,vue3 setup写法:

<script setup>
import { nextTick, onMounted, reactive, ref } from "vue";
import { getDatePiker } from "@/utils/cabinData";
import {timeLimits} from "@/utils"
const timeRange = 1 * 24 * 60 * 60 * 1000; // 1天时间戳
const timeToTimestamp = (time) => {let timestamp = Date.parse(new Date(time).toString());return timestamp;};
export const timeLimits=(times,message,intervalTime=7)=>{const minTime = timeToTimestamp(times[0]);const maxTime = timeToTimestamp(times[1]);const isOver7 = maxTime - minTime > timeRange * intervalTime;if (isOver7) {ElMessage({type: "warning",message: message===undefined?`历史记录查询时间不能超过7天`:message,});return false;}else{return true;}
}
const timeTypeList = reactive([{name: "年",dateType: "2",type: "year",valueFormat: "YYYY",getDatePikerformat: "yyyy",range: false,},{name: "月",dateType: "1",type: "month",valueFormat: "YYYY-MM",getDatePikerformat: "yyyy-MM",range: false,},{name: "自定义",dateType: "3",type: "daterange",valueFormat: "YYYY-MM-DD",range: true,},
]);const Selected = ref(2);
const data = reactive({time: null,
});const changeSelected = (_index) => {Selected.value = _index;if (timeTypeList[_index].range) {nextTick(() => {data.time = getDatePiker(30);});} else {data.time = getDatePiker(30, timeTypeList[_index].getDatePikerformat)[1];// console.log(timeTypeList[_index].valueFormat);}
};onMounted(() => {data.time = getDatePiker(30);
});const getTimeParams = () => {if (!timeTypeList[Selected.value].range) {return {dateType: timeTypeList[Selected.value].dateType,dateTime: data.time,};} else {if(timeLimits(data.time,'历史记录查询或者导出不能超过30天',30)){return false}else{return {dateType: timeTypeList[Selected.value].dateType,startTime: data.time[0],endTime: data.time[1],};}}
};defineExpose({getTimeParams,
});
</script><template><div class="time_change"><divclass="time_type"v-for="(item, index) in timeTypeList":key="index":class="Selected === index ? 'time_type_selected' : ''"@click="changeSelected(index)">{{ item.name }}</div><el-form :model="data" class="search-box2"><el-form-itemlabel="时间范围"class="search-input search-input4"prop="time"><el-date-pickerv-model="data.time":type="timeTypeList[Selected].type":value-format="timeTypeList[Selected].valueFormat"range-separator="至"start-placeholder="开始时间"end-placeholder="结束时间":unlink-panels="true":clearable="false"/></el-form-item></el-form></div>
</template><style lang="less" scoped>
.time_change {width: 100%;height: 100%;display: flex;justify-content: space-between;align-items: center;.time_type {height: 36px;line-height: 36px;padding: 0 10px;background: #ebf0f5;border-radius: 4px 4px 4px 4px;border: 1px solid #ffffff;color: #4279ca;cursor: pointer;}.time_type_selected {background: #4279ca;color: #ffffff;}.search-box2 {width: 423px;height: 36px;line-height: 36px;:deep(.el-form-item) {.el-form-item__label {padding-left: 0.57292vw;background-color: #dae5f2 !important;color: #4279ca;font-size: calc(100vw * 16 / 1920);height: 2.1875vw;text-align: center;line-height: 2.1875vw;justify-content: flex-start;}.el-date-editor .el-range-input{font-size: calc(100vw * 18 / 1920);}.el-input__inner{font-size: calc(100vw * 18 / 1920);}}.el-form-item {width: 100%;height: 100%;box-sizing: border-box;margin: 0;border: none;line-height: inherit;background: #f0f5fa;border-radius: 4px 4px 4px 4px;border: 1px solid #ffffff;:deep(.el-form-item__label) {height: 100%;border-radius: 4px;line-height: inherit;}:deep(.el-form-item__content) {flex: 1;.el-input {height: 100%;}.el-input__wrapper {box-shadow: none;background: none;height: 100%;}}}}
}
</style>

四、其它

1.组件默认填充时间,默认填充最近30天;

eg:

getDatePiker(30);

/*** 时间选择器默认选中,最近多少天*/
export const getDatePiker = (dates,dateType='yyyy-MM-dd') => {let valueTwoTimer = []let newData = new Date();let nowMonth = frontOneHour(newData, dateType);const front12Hour = new Date(newData - 1000 * 60 * 60 * 24 * (dates-1));;let beforeMonth = frontOneHour(front12Hour, dateType);valueTwoTimer.push(beforeMonth);valueTwoTimer.push(nowMonth);return valueTwoTimer
};

 2.不能超过30天数,当不传参的时候默认不超过7天;

eg:

timeLimits(data.time, "历史记录查询或者导出不能超过30天", 30)

// 
const timeRange = 1 * 24 * 60 * 60 * 1000; // 1天时间戳
const timeToTimestamp = (time) => {let timestamp = Date.parse(new Date(time).toString());return timestamp;};
export const timeLimits=(times,message,intervalTime=7)=>{const minTime = timeToTimestamp(times[0]);const maxTime = timeToTimestamp(times[1]);//判断是否超过7天,或者30天。接收传参intervalTimeconst isOver7 = maxTime - minTime > timeRange * intervalTime;if (isOver7) {//超过7天,进行显示提示信息。并打断,给调用的语句返回一个false//外层调用根据返回的“false”,进行打断处理,详见如下写在后面。ElMessage({type: "warning",message: message===undefined?`历史记录查询时间不能超过7天`:message,});return false;}else{return true;}
}

2.写在最后

外层调用timeLimits()

//暴露此方法
//如果超过30天,返回false;否则返回开始时间和结束时间,以及dateType(接口参数)
const getTimeParams = () => {if (!timeTypeList[Selected.value].range) {return {dateType: timeTypeList[Selected.value].dateType,dateTime: data.time,};} else {if (!timeLimits(data.time, "历史记录查询或者导出不能超过30天", 30)) {return false;} else {return {dateType: timeTypeList[Selected.value].dateType,startTime: data.time[0],endTime: data.time[1],};}}
};defineExpose({getTimeParams,
});

五、年月日分别解释

1.选择年,日期选择组件默认填充是:当时的年;

 

 2.选择月,日期选择组件默认填充的是:当时的年月;

 

 3.选择日,日期选择组件默认填充的是:当时的年月日;

默认填充最近30天。

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

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

相关文章

微信小程序使用iconfont

进入iconfont&#xff0c;添加至项目 进入项目&#xff0c;点击生成代码&#xff0c;或更新代码 点击打开样式 复制内容到小程序的style文件夹下 最后引入到app.wxss

Redis-底层数据结构

Redis-底层数据结构 redisObject对象机制对象共享引用计数以及对象的消毁 动态字符串SDS链表链表的优缺点: 压缩链表ziplist的缺点 字典-Dictrehash渐进式rehash 整数集-intSet内存分布图整数集合的升级 跳表 - ZSkipList快表-quicklistlistpack redisObject对象机制 typedef s…

6端口百兆以太网交换机控制芯片//P 2 P RTL8306MB

JL5106-N064C是一款6端口快速以太网交换机控制器&#xff0c;将内存&#xff0c;6个mac和5个物理层收发器集成到单个芯片中&#xff0c;用于10Base-T和100Base-TX操作。 JL5106-N064C支持双MII/RMII接口&#xff0c;用于外部设备连接第6MAC、第5 MAC和第5 PHY。外部设备可以是路…

Pulsar服务端处理消费者请求以及源码解析

文章目录 引言正文处理消费请求回调处理总结 引言 处理读写是Pulsar服务端最基本也是最重要的逻辑&#xff0c;今天就重点看看服务端是如何处理的读请求也就是消费者请求 正文 Pulsar服务端处理消费者请求的流程大致如下图所示 消费者通过TCP向服务端发起消息拉取请求Brok…

idea开发 java web 高校学籍管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 高校学籍管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css jq…

使用git 和 github协作开发

文章目录 github浏览器汉化插件github新建仓库git安装以及ssh配置团队创建及基本命令的使用创建团队基本命令 分支管理快速切换远程仓库地址 如何使用git && github进行协作开发&#xff0c;包括git常见基础命令 github浏览器汉化插件 在刚开始使用github的时候&#…

openGauss 5.0 单点企业版部署_Centos7_x86(上)

背景 通过openGauss提供的脚本安装时&#xff0c;只允许在单台物理机部署一个数据库系统。如果您需要在单台物理机部署多个数据库系统&#xff0c;建议您通过命令行安装&#xff0c;不需要通过openGauss提供的安装脚本执行安装。 本文档环境&#xff1a;CentOS7.9 x86_64 4G1…

物联网数据服务平台

随着物联网技术的迅猛发展&#xff0c;海量数据的产生和应用成为推动工业数字化转型的核心动力。在这个数据为王的时代&#xff0c;如何高效地收集、处理、分析并应用这些数据&#xff0c;成为了企业关注的焦点。物联网数据服务平台应运而生&#xff0c;为企业提供了全面、高效…

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…

IEC101、IEC103、IEC104、Modbus报文解析工具

一、概述 国际电工委员会第57技术委员会&#xff08;IEC TC57&#xff09;1995年出版IEC 60870-5-101后&#xff0c;得到了广泛的应用。为适应网络传输&#xff0c;2000年IEC TC57又出版了IEC 60870-5-104&#xff1a;2000《远东设备及系统 第5-104部分&#xff1a;传输规约-采…

基于SpringBoot+Vue+Mysql的图书管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

C++手撕红黑树

文章目录 红黑树概念性质&#xff08;条件限制&#xff09;节点的定义红黑树的结构红黑树的插入cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在或u为黑&#xff0c;插入到p对应的一边cur为红…

深度评测2024年热门婴儿洗衣机,鲸立、希亦、小吉等品牌一网打尽!

为人父母&#xff0c;是一件非常美妙的事情&#xff0c;在养育新生命的过程中&#xff0c;细心的照顾是非常重要的&#xff0c;而最小的细节&#xff0c;就是让婴儿的衣服保持最温和、最有效的清洁。而婴儿洗衣机是当今不少家庭的福音&#xff0c;它给家长们带来了巨大的方便&a…

R语言数据可视化:ggplot2绘图系统

ggpolt2绘图系统被称为R语言中最高大上的绘图系统&#xff0c;使用ggplot2绘图系统绘图就像是在使用语法创造句子一样&#xff0c;把数据映射到几何客体的美学属性上。因此使用ggplot2绘图系统的核心函数ggplot来绘图必须具备三个条件&#xff0c;数据data&#xff0c;美学属性…

力扣HOT100 - 560. 和为k的子数组

解题思路&#xff1a; 方法一&#xff1a;枚举 class Solution {public int subarraySum(int[] nums, int k) {int cnt 0;for (int start 0; start < nums.length; start) {int sum 0;//注意开始位置for (int end start; end < nums.length; end) {sum nums[end];…

软件设计师知识点-1

串行的计算公式为&#xff1a;(取值时间分析时间执行时间) x 指令的个数 流水线的计算公式为&#xff1a;单条指令的执行时间 (n-1) x 流水线周期 n的意思为指令的个数&#xff0c;流水线周期的意思为取值&#xff0c;分析&#xff0c;执行三条执行过程中花费时间最多的那条…

VSCode配置AI自动补全插件Tabnine

面向软件开发人员的 AI 助手 使用 AI 代码完成更快地编写代码 什么是Tabnine Tabnine 是一款 AI 代码助手&#xff0c;可让您成为更好的开发人员。Tabnine 将通过所有最流行的编码语言和 IDE 的实时代码完成、聊天和代码生成来提高您的开发速度。 无论您将其称为 IntelliSens…

代码随想录阅读笔记-二叉树【二叉搜索树转换为累加树】

题目 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&…

Java绘图坐标体系

一、介绍 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点x个像素&#xff1b;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐…

西门子PLC(S7-200 SMART)学习笔记1:初识PLC可编程逻辑器件

今日开始我的西门子PLC学习之路&#xff0c;学习的型号以S7-200 SMART为主 主要认识一下PLC是什么、型号怎么看、 通信相关、编程软件、构造及工作原理 目录 西门子官方PLC手册获取&#xff1a; 1、PLC可编程逻辑器件的基本认识&#xff1a; PLC的结构及各部分的作用&#xff…