vue3+vant4封装日期时间组件(年月日时分秒)

news2024/11/25 21:26:04

vant4目前无法直接使用vant3自带的年月日时分秒组件,综合考虑下,决定自己封装一个!

vue3+vant4封装日期时间组件(年月日时分秒)

  • 效果图
  • 代码片段
    • 核心组件代码
    • 引入

效果图

在这里插入图片描述

代码片段

核心组件代码

<template>
  <!-- 弹出层 -->
  <van-popup v-model:show="data.isPicker" position="bottom" round @close="confirmOn">
    <van-picker ref="picker" title="请选择时间" :columns="data.columns" @change="onChange" @cancel="cancelOn"
      @confirm="onConfirm" v-model="data.selectedValues" />
  </van-popup>
</template>
<script setup>

import { reactive, watch, getCurrentInstance } from "vue";

const customFieldName = {
  text: "value",
  value: "values",
  children: ""
};
const data = reactive({
  isPicker: false, //是否显示弹出层
  columns: [], //所有时间列
  selectedValues: [] //控件选择的时间值
});

const props = defineProps({
  // 传入的显影状态
  showPicker: {
    type: Boolean
  },
  // 传入的值
  values: {
    type: String
  }
});

//定义要向父组件传递的事件
const emit = defineEmits(["changeValue", "confirm"]);


watch(
  () => props.showPicker,
  val => {
    data.isPicker = val;
    data.columns = [];
    getcolumns();
  },
  {
    immediate: true//立即监听--进入就会执行一次 监听显影状态
  }
);


function onChange() {
  // 无用的方法 
}


function getcolumns() {
  let strtime = props.values; //传入的时间
  //console.log(strtime); 2023-09-05 19:28:00 
  let date = new Date(strtime.replace(/-/g, "/"));
  // console.log(date); Wed Aug 09 2023 14:53:15 GMT+0800 (中国标准时间) 
  let timeVaules = date.getTime();

  let dateVaules;
  if (props.values != "") {
    dateVaules = new Date(timeVaules);
  } else {
    dateVaules = new Date(); //没有传入时间则默认当前时刻
  }

  let Y = dateVaules.getFullYear();
  let M = dateVaules.getMonth();
  let D = dateVaules.getDate();
  let h = dateVaules.getHours();
  let m = dateVaules.getMinutes();
  let s = dateVaules.getSeconds();

  let year = []; //获取前后十年数组
  year.values = [];
  let Currentday = new Date().getFullYear();
  for (let i = Currentday - 10; i < Currentday + 10; i++) {
    year.push({ text: i.toString(), value: i });
  }
  year.defaultIndex = year.values.indexOf(Y); //设置默认选项当前年

  // 个位数补0
  const _M = M < 10 ? `0${M + 1}` : M.toString(); //月份比实际获取的少1,所以要加1
  const _D = D < 10 ? `0${D}` : D.toString();
  const _h = h < 10 ? `0${h}` : h.toString();
  const _m = m < 10 ? `0${m}` : m.toString();
  const _s = s < 10 ? `0${s}` : s.toString();

  // 生成年月日时分秒时间值
  data.selectedValues.push(Y);
  data.selectedValues.push(_M);
  data.selectedValues.push(_D);
  data.selectedValues.push(_h);
  data.selectedValues.push(_m);
  data.selectedValues.push(_s);

  data.columns.push(year); //生成年列

  let month = []; //获取12月数组
  month = Object.keys(Array.apply(null, { length: 13 })).map(function (item) {
    if (+item + 1 <= 10) {
      return { text: "0" + item, value: "0" + item };
    } else if (+item + 1 == 11) {
      return { text: +item, value: +item };
    } else {
      return {
        text: (+item + 0).toString(),
        value: (+item + 0).toString()
      };
    }
  });
  month.splice(0, 1);
  data.columns.push(month); //生成月列

  //获取当月的天数
  let days = getCountDays(Y, M + 1);
  let day = []; //创建当月天数数组
  day = Object.keys(Array.apply(null, { length: days + 1 })).map(function (
    item
  ) {
    if (+item + 1 <= 10) {
      return { text: "0" + item, value: "0" + item };
    } else if (+item + 1 == 11) {
      return { text: +item, value: +item };
    } else {
      return {
        text: (+item + 0).toString(),
        value: (+item + 0).toString()
      };
    }
  });
  day.splice(0, 1);
  data.columns.push(day); //生成日列

  let hour = []; //创建小时数组
  hour = Object.keys(Array.apply(null, { length: 24 })).map(function (item) {
    if (+item + 1 <= 10) {
      return { text: "0" + item, value: "0" + item };
    } else if (+item + 1 == 11) {
      return { text: +item, value: +item };
    } else {
      return {
        text: (+item + 0).toString(),
        value: (+item + 0).toString()
      };
    }
  });
  data.columns.push(hour); //生成小时列

  let mi = []; //创建分钟数组
  mi = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
    if (+item + 1 <= 10) {
      return { text: "0" + item, value: "0" + item };
    } else if (+item + 1 == 11) {
      return { text: +item, value: +item };
    } else {
      return {
        text: (+item + 0).toString(),
        value: (+item + 0).toString()
      };
    }
  });
  data.columns.push(mi);//生成分钟列

  let ss = []; //创建秒数数组
  ss = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
    if (+item + 1 <= 10) {
      return { text: "0" + item, value: "0" + item };
    } else if (+item + 1 == 11) {
      return { text: +item, value: +item };
    } else {
      return {
        text: (+item + 0).toString(),
        value: (+item + 0).toString()
      };
    }
  });
  data.columns.push(ss);//生成秒钟列
}


function getCountDays(year, month) {
  //获取某年某月多少天
  let day = new Date(year, month, 0);
  return day.getDate();
}

// 关闭弹框
function confirmOn() {
  emit("changeValue");
}


//时间选择器关闭 值不改变并关闭弹框
function cancelOn({ selectedValues }) {
  confirmOn()
}

// 时间选择器确定 值改变
function onConfirm({ selectedValues }) {
  let endval =
    selectedValues[0] +
    "-" +
    selectedValues[1] +
    "-" +
    selectedValues[2] +
    " " +
    selectedValues[3] +
    ":" +
    selectedValues[4] +
    ":" +
    selectedValues[5];

  confirmOn()
  emit("confirm", endval);
}
</script>


引入

 
import DataTime from "@/components/datatime/index.vue";
...
const startTime = ref(""); //值定义
const showPicker = ref(false); //弹框显隐

const onConfirm = selectedValues => {
  //console.log(selectedValues);
  //2023-09-08 19:01:37
  startTime.value = selectedValues;
  showPicker.value = false;
};

 <DataTime
   :values="endTime"
    @changeValue="showPicker = false" //子组件方法
    :showPicker="showPicker"
    @confirm="onConfirm" //子组件方法
  />
  ...

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

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

相关文章

软件评测师之码制

目录 一、机器数二、码制三、数的表示范围 一、机器数 机器数就是一个数在计算机中的二进制表示&#xff0c;计算机中机器数的最高位是符号位&#xff0c;正数符号位为0&#xff0c;负数符号位为1&#xff0c;机器数包含原码、反码和补码三种表示形式。 二、码制 表现形式数…

Flink基础

Flink architecture job manager is master task managers are workers task slot is a unit of resource in cluster, number of slot is equal to number of cores(超线程则slot2*cores), slot一组内存一些线程共享CPU when starting a cluster,job manager will allocate a …

【个人博客系统网站】我的博客列表页 · 增删改我的博文 · 退出登录 · 博客详情页 · 多线程应用

【JavaEE】进阶 个人博客系统&#xff08;4&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;4&#xff09;1. 增加博文1.1 预期效果1.1 约定前后端交互接口1.2 后端代码1.3 前端代码1.4 测试 2. 我的博客列表页2.1 期待效果2.2 显示用户信息以及博客信息2.2.1…

文件能做二维码吗?多种文件格式在线转二维码

怎么把文件做成二维码&#xff1f;在使用电脑办公时&#xff0c;必不可少的经常会使用word、excel、ppt等文件格式&#xff0c;那么当需要将文件生成二维码使用时&#xff0c;如何操作才能快速制作二维码呢&#xff1f;可以使用二维码生成器来在线制作二维码&#xff0c;与使用…

知识储备--基础算法篇-子串

1.子串 1.1第560题-和为k的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的连续子数组的个数 。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 一开始想用滑动窗口&#xff0c;但是在运行过程中碰…

定时任务管理器(xxl-job)

文章目录 xxl-job简介安装使用拉取xxl-job项目导入数据库表启动 admin 服务端Spring Boot 整合 xxl-job修改执行器新建定时任务 xxl-job简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。开箱即用。 admin &#xff1a;…

uni-app 可视化创建的项目 移动端安装调试插件vconsole

可视化创建的项目&#xff0c;在插件市场找不到vconsole插件了。 又不好npm install vconsole 换个思路&#xff0c;先创建一个cli脚手架脚手架的uni-app项目&#xff0c;然后再此项目上安装vconsole cli脚手架创建uni-app项目 安装插件 项目Terminal运行命令&#xff1a;npm…

商城开发:店铺管理系统应具备哪些功能?

电子商务的迅猛发展&#xff0c;越来越多的企业选择在线商城作为业务拓展的重要渠道。而要实现一个成功的在线商城&#xff0c;一个强大而高效的店铺管理系统是不可或缺的。店铺管理系统作为商城的核心管理工具&#xff0c;应具备一系列功能&#xff0c;以提供卓越的用户体验和…

游戏海外运营需要准备什么?

游戏海外运营需要充分的准备和计划&#xff0c;以确保游戏在目标市场中取得成功。以下是一些游戏海外运营需要准备的关键方面。 游戏平台 游戏出海必不可少的就是游戏平台&#xff0c;而且要注意的是&#xff0c;海外游戏平台的搭建和国内有所不同&#xff0c;对于支付方式和语…

zabbix监控网络设备和zabbix proxy

监控linux主机 [rootrocky8 conf]# yum -y install net-snmp vim /etc/snmp/snmpd.conf com2sec notConfigUser default 123456##修改此行,设置团体密码,默认为public,此处 改为123456 view systemview included .1. ##添加此行,自定义授权,否则 zabbix 无法获取数据 [rootr…

【Redis】NoSQL之Redis的配置及优化

关系数据库与非关系数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&a…

websocket--技术文档--spring后台+vue基本使用

阿丹: 给大家分享一个可以用来进行测试websocket的网页&#xff0c;个人觉得还是挺好用的. WebSocket在线测试工具 还有一个小家伙ApiPost也可以进行使用websocket的测试。 本文章只是基本使用--给大家提供思路简单实现&#xff01;&#xff01; 使用spring-boot建立一个服…

SNI代理与DNS解析相结合

在当今互联网时代&#xff0c;加密通信已成为保护用户隐私和数据安全的重要手段。而使用HTTPS协议进行加密传输更是日益普及。然而&#xff0c;在构建一个高效且灵活的HTTPS代理服务器时&#xff0c;我们常常面临着一些挑战。 针对这个问题&#xff0c;引入SNI&#xff08;Ser…

关于在本地启动跨域非nodejs的前后端分离项目

目前的前后端分离&#xff0c;dev开发模式下&#xff0c;本地启动时会首先启动一个nodejs作为服务器&#xff0c;把本地网页启动起来&#xff0c;同时对后端的接口请求&#xff0c;可以经过proxy来实现&#xff0c;从而避免了浏览器的跨域检查。 但是有些陈旧的基于jquerylayu…

【LeetCode-中等题】46. 全排列

文章目录 题目方法一&#xff1a;递归回溯 题目 这题中nums中的数各不相同&#xff0c;所以不需要去重&#xff1a; 而下面这题&#xff0c;nums中的数会存在重复值&#xff0c;就需要去重&#xff1a; 方法一&#xff1a;递归回溯 关键在于递归之后还要还原做回溯动作&#…

ToBeWritten之威胁狩猎

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

高并发下机器QPS计算、最佳线程数计算

一、QPS&#xff0c;每秒查询 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中&#xff0c;作为域名系统服务器的机器的性能经常…

macos13 arm芯片(m2) 搭建hbase docker容器 并用flink通过自定义richSinkFunction写入数据到hbase

搭建hbase docker容器 下载镜像 https://hub.docker.com/r/satoshiyamamoto/hbase/tags 点击run 使用镜像新建容器 填写容器名和 容器与宿主机的端口映射 测试 通过宿主机访问容器内的hbase webUI http://localhost:60010/master-status

WINGREEN 03ZSTI4-00-501

中央处理单元&#xff08;CPU&#xff09;支持&#xff1a;WINGREEN 03ZSTI4-00-501 控制主板模块可能配备了一个或多个CPU核心&#xff0c;用于处理数据和执行指令。 内存支持&#xff1a; 它可以支持系统内存&#xff08;RAM&#xff09;&#xff0c;以存储和访问数据。 输…

C语言共用体详解

文章目录 共用体解释代码说明小端存储 Little Endian共用体与小端存储为什么只能用第一个成员类型的值初始化一个共用体变量 共用体解释 共用体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c; 它允许在同一个内存位置存储不同的数据类型。 共用体的所有成员共…