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

news2024/11/27 1:04:00

一、背景

基于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">
    <div
      class="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-item
        label="时间范围"
        class="search-input search-input4"
        prop="time"
      >
        <el-date-picker
          v-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天。接收传参intervalTime
      const 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.coloradmin.cn/o/1578233.html

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

相关文章

从人机界面设计黄金三法则视角看 ChatGPT 的界面设计的“好”与“坏”

热门文章推荐&#xff1a; &#xff08;1&#xff09;《为什么很多人工作 3 年 却只有 1 年经验&#xff1f;》&#xff08;2&#xff09;《一文掌握大模型提示词技巧&#xff1a;从战略到战术巧》&#xff08;3&#xff09;《AI 时代&#xff0c;程序员的出路在何方&#xff1…

window安装c环境(window安装GCC)

1.下载mingw 地址&#xff1a;MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 2.安装mingw-get-setup.exe文件&#xff1a; 安装完成之后显示&#xff1a; 3.勾选需要安装的内容&#xff0c;然后进行安装或按第5步使用命令安装&#xff0c;推荐使用5步…

华为USG6000v

1、安全区域 一个及或多个接口的集合 默认的安全区域 Trust --- 优先级85&#xff0c;一般连接内网 Untrust --- 优先级5&#xff0c; 一般连接外网 Dmz --- 优先级50&#xff0c;一般连接服务器、 Local --- 优先级100&#xff0c;防火墙接口所在区的区域 2…

在Ubuntu系统下连接远程Ubuntu服务器

本篇文章介绍&#xff0c;如何在Ubuntu系统下连接远程Ubuntu系统并传输文件。 一. 连接远程Ubuntu服务器。 1. 打开命令行&#xff0c;输入 : sudo apt-get update &#xff0c; 对系统进行更新。 2. 安装 OpenSSH Server&#xff0c;输入 &#xff1a; sudo apt-get insta…

mysql 运算符 语句 字符集 校队集

mysql 运算符 使用select语句可以输出运算的结果 mysql标识符不区分大小写 算数运算符 1./除法 得到的结果是一个小数 %是整数,省略小数 2、除以0不会报错,得到的结果是 null 3.数宇和字符串做加法运算,并不会拼接 比较运算符 1.mysql里面的=是比较运算符,而不是赋值运算…

深入解析template,掌握C++模板的精髓!

掌握C模板&#xff08;template&#xff09;的优雅之道&#xff01; 一、什么是模板&#xff1f;二、模板如何工作&#xff1f;三、C 中的模板类型3.1、 类模板3.2、 函数模板 四、模板参数推导4.1、模板参数推导示例4.2、函数模板参数推导4.3、类模板参数推导&#xff08;C17 …

《C语言深度解剖》(4):深入理解一维数组和二维数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

IEEE Robotics and Automation Letters(RAL)论文模板及投稿须知

一、背景 IEEE Robotics and Automation Letters&#xff08;RAL&#xff09;期刊自2015年6月1日创刊以来&#xff0c;得到了机器人领域许多学术大牛的青睐&#xff0c;因其周期短&#xff0c;论文质量高&#xff0c;许多优秀的成果都会选择发表在RAL期刊上。下面介绍一下RAL论…

如何从零基础进入IT行业

目录 前言1 确定适合的方向1.1 前端开发1.2 后端开发1.3 数据分析1.4 软件测试1.5 产品管理1.6 网络与系统管理 2 制定学习计划2.1 学习基础知识2.2 选择合适的学习资源2.3 参加课程或培训2.4 制定学习计划和目标 3 实践项目和参与社区3.1 构建个人项目3.2 参与开源社区3.3 寻找…

回顾2D绘图的数学知识

本篇旨在帮助开发人员回顾在2D图形编程中可能会涉及到的数学知识。 1. 矩形 矩形面积 S 长 ∗ 宽 S 长 * 宽 S长∗宽 矩形周长 C 2 ∗ ( 长 宽 ) C 2 * ( 长 宽) C2∗(长宽) 2. 两点间的距离 在直角坐标系中&#xff0c;设两个点A、B以及坐标分别为 A ( x 1 , y 1…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片(sharding)来进行数据共享&#xff0c;并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成&#xff0c;在刚开始的时候&#xff0c;每个节点都是相互独立的&#xff0c;它们都…

X86汇编速成

平时用的电脑都是X86的&#xff0c;但是现在大家都在搞RISC-V&#xff0c;计组也都开始以RISC-V作为示例&#xff0c;所以专门回头来补一下X86的汇编&#xff0c;方便平时使用。 寄存器register X86_64中一共有16个64位的通用寄存器&#xff0c;分别为&#xff1a; RAX, RBX,…

vmware和ubuntu的问题与解决

1.问题与对策 最近使用vmware安装ubuntu16和ubuntu20&#xff0c;遇到了挺多的问题&#xff0c;如下 ubuntu在用过多次后&#xff0c;重启后登录用户名后会出现花屏的现象。 解决方案如下 在键盘上同时按键&#xff1a;Ctrl Alt F4&#xff0c;进入命令行模式&#xff0c;…

Ubuntu 20.04.06 PCL C++学习记录(十六)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 用一组点云数据做简单的平面的分割 源代码及所用函数 源代码 #include<iostr…

C++设计模式:观察者模式(三)

1、定义与动机 观察者模式定义&#xff1a;定义对象间的一种1对多&#xff08;变化&#xff09;的依赖关系&#xff0c;以便当一个对象&#xff08;Subject&#xff09;的状态发生比改变时&#xff0c;所有依赖于它的对象都得到通知并且自动更新 再软件构建过程中&#xff0c…

STM32一个地址未对齐引起的 HardFault 异常

1. 概述 客户在使用 STM32G070 的时候&#xff0c;KEIL MDK 为编译工具&#xff0c;当编译优化选项设置为Level0 的时候&#xff0c;程序会出现 Hard Fault 异常&#xff0c;而当编译优化选项设置为 Level1 的时候&#xff0c;则程序运行正常。表面上看&#xff0c;这似乎是 K…

算法打卡day38|动态规划篇06| 完全背包理论基础|Leetcode 518.零钱兑换II、377. 组合总和 Ⅳ

目录 完全背包理论基础 完全背包问题描述 完全背包解法 算法题 Leetcode 518.零钱兑换II 个人思路 解法 动态规划 Leetcode 377. 组合总和 Ⅳ 个人思路 解法 动态规划 完全背包理论基础 完全背包问题描述 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是…

基于SSE长连接的智能客服问答系统技术方案及完整项目源码

文章目录 一、项目背景二、项目演示三、项目介绍B系统主要功能1. 注册登录重置密码2. 权限管理3. 项目管理4.客服管理 C系统主要功能1. 问答组件2. 主题色定制3. 类微信时间显示控件及智能tip提示4. 无障碍阅读4. 丰富的输入框组件5. 人工客服6. 聊天记录分表记录与查询 四、项…

【拓扑的基】示例及详解

集合X的某拓扑的一个基是X的子集的一个族(其成员称为基元素)&#xff0c;满足条件&#xff1a; 1. 2. 由基生成拓扑 由生成的拓扑(满足以上两个条件&#xff09; 等价描述&#xff1a; 由所有可表示为的某些成员的井的那些集合组成 例1: 证明&#xff1a;由生成的族确实是拓扑…