vue基于vant封装可精确到秒的时间选择器

news/2024/10/30 13:35:34/

前言

在移动开发中,时间选择的控件比比皆是,但却鲜有类似的组件可以精确到秒级别的,官方可能是考虑到小屏幕手机的显示问题,也可能是使用的场景寥寥无几,但是少不代表没有,所以最近花了点时间基于 vant 组件库封装了一个可以精确到秒级别的时间选择器。


实现思路

本章我们主要用到了 vant 组件库中的 Popup 弹出层组件搭配 DatetimePicker 组件进行时间选择。通过 propsemit 进行组件之间的通信。其实 vant 已经封装好一系列的代码了,我们需要修改的是自定义年月日时分秒的时间数据并将其添加到绑定的数组中即可。话不多说,下面直接看代码的实例。


封装文件

文件目录:src/components/timePicker

<template><div><!-- 弹出层 --><van-popup get-container="body" v-model="isPicker" position="bottom" @close="confirmOn"><!-- 时间选择 --><van-picker ref="picker" show-toolbar title="请选择时间" :columns="columns" @change="onChange" @cancel="cancelOn" @confirm="onConfirm" /></van-popup></div>
</template>
<script>
export default {name: "popup",props: ["showPicker", "values"],data() {return {isPicker: false, //是否显示弹出层columns: [], //所有时间Mdays: "", //弹窗关闭时月份所在值Dindex: null,};},watch: {isPicker(val) {!val && this.$emit("changeValue");this.columns = [];this.getcolumns();},showPicker(val) {this.isPicker = val;},values(val) {if (val == "") {this.Mdays = "";this.Dindex = null;}},},methods: {getCountDays(year, month) {//获取某年某月多少天var day = new Date(year, month, 0);return day.getDate();},getcolumns() {var strtime = this.values;var date = new Date(strtime.replace(/-/g, "/"));var vmoduletime = date.getTime();if (this.values != "") {var vmoduledate = new Date(vmoduletime);} else {var vmoduledate = new Date(); //没有传入时间则默认当前时刻}var Y = vmoduledate.getFullYear();var M = vmoduledate.getMonth();var D = vmoduledate.getDate();var h = vmoduledate.getHours();var m = vmoduledate.getMinutes();var s = vmoduledate.getSeconds();var year = {}; //获取前后十年数组year.values = [];var Currentday = new Date().getFullYear();for (var i = Currentday - 10; i < Currentday + 10; i++) {year.values.push(i + "年");}year.defaultIndex = year.values.indexOf(Y + "年"); //设置默认选项当前年this.columns.push(year);var month = {}; //获取12月数组month.defaultIndex = M;month.values = Object.keys(Array.apply(null, { length: 13 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "月";} else if (+item + 1 == 11) {return +item + "月";} else {return (+item + 0).toString() + "月";}});month.values.splice(0, 1);this.columns.push(month);//获取当月的天数var days = this.getCountDays(Y, this.Mdays == "" ? M + 1 : this.Mdays);var day = {}; //创建当月天数数组day.defaultIndex = this.Dindex == null ? D - 1 : this.Dindex;day.values = Object.keys(Array.apply(null, { length: days + 1 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "日";} else if (+item + 1 == 11) {return +item + "日";} else {return (+item + 0).toString() + "日";}});day.values.splice(0, 1);this.columns.push(day);var hour = {}; //创建小时数组hour.defaultIndex = h;hour.values = Object.keys(Array.apply(null, { length: 24 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "时";} else if (+item + 1 == 11) {return +item + "时";} else {return (+item + 0).toString() + "时";}});this.columns.push(hour);var mi = {}; //创建分钟数组mi.defaultIndex = m;mi.values = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "分";} else if (+item + 1 == 11) {return +item + "分";} else {return (+item + 0).toString() + "分";}});this.columns.push(mi);var ss = {}; //创建秒数数组ss.defaultIndex = s;ss.values = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "秒";} else if (+item + 1 == 11) {return +item + "秒";} else {return (+item + 0).toString() + "秒";}});this.columns.push(ss);},onChange(values, a) {//a为所有列备选项值的数组var days = this.getCountDays(a[0].substr(0, 4), a[1].substr(0, 2));var newdays = {};newdays.values = Object.keys(Array.apply(null, { length: days + 1 })).map(function (item) {if (+item + 1 <= 10) {return "0" + item + "日";} else if (+item + 1 == 11) {return +item + "日";} else {return (+item + 0).toString() + "日";}});newdays.values.splice(0, 1);this.$refs.picker.setColumnValues(2, newdays.values); //设置第三列的值this.$refs.picker.setColumnIndex(2, a[2].substr(0, 2) - 1); //设置第三列索引},// 关闭弹框confirmOn() {var currentM = this.$refs.picker.getColumnValue(1);this.Mdays = currentM.substr(0, 2);this.Dindex = this.$refs.picker.getColumnIndex(2);},//时间选择器关闭cancelOn() {this.$emit("changeValue");},// 时间选择器确定onConfirm(val, index) {var endval =val[0].substr(0, 4) +"-" +val[1].substr(0, 2) +"-" +val[2].substr(0, 2) +" " +val[3].substr(0, 2) +":" +val[4].substr(0, 2) +":" +val[5].substr(0, 2);this.$emit("changeValue", endval);this.$emit("confirm", endval);},},
};
</script>

使用组件

<template><div><div @click="revealOn">点击选择时间</div><timePicker :values="timeVal" @changeValue="timePickerShow = false" ref="popup" :showPicker="timePickerShow" @confirm="confirmOn" /></div>
</template>
<script>
import timePicker from "@/components/timePicker";
export default {components: {timePicker,},data() {return {timeVal: "", //选中时间的值timePickerShow: false, //打开/关闭时间选择器};},methods: {// 点击选择时间revealOn() {this.timePickerShow = true;},// 时间选择器确定confirmOn(val) {console.log(val);},},
};
</script>

实现效果

在这里插入图片描述


http://www.ppmy.cn/news/33070.html

相关文章

102.【Redis】

Resies集群前言(一)、Nosql概述1、为什么要用NoSQL &#xff1f;2、什么是Nosql3、Nosql特点4、Nosql的四大分类5、阿里巴巴数据结构演进(二)、Redis入门1.概述2.Redis能干什么?3、Redis的特点4、window安装Redis5、Linux安装Redis6、redis-benchmark性能测试7、Redis基础知识…

激光雷达烧坏手机摄像头,到底发生了什么?

作者 | 洪泽鑫 编辑 | 王博用手机对着激光雷达拍照或录像&#xff0c;可能会把你的手机摄像头干废。 本月初&#xff0c;有用户在社交平台小红书上称&#xff0c;“夜拍蔚来ET5和银河&#xff0c;发现排出来的照片有两个贼亮的看不到的星&#xff0c;发现是手机摄像头被激光雷达…

C++ | 对比inline内联函数和宏的不同点

文章目录一、前言二、宏的优缺点分析1、概念回顾2、宏的缺点3、宏的优点三、inline内联函数1、概念2、特性①&#xff1a;空间换时间&#x1f381;趣味杂谈&#xff1a;庞大的游戏更新包3、特性②&#xff1a;inline实现机制4、特性③&#xff1a;inline的声明与定义反汇编观察…

滑动窗口编程题集合(leetcode)

滑动窗口是双指针的一种应用&#xff0c;形象点说就是维护一个窗口&#xff0c;在窗口滑动的过程中进行窗口内数据的更新&#xff0c;并判断是否符合答案。初始时两个指针均指向开头&#xff0c;然后右指针依次向右滑动&#xff0c;在滑动的过程中需要收缩的时候进行左指针的移…

vue基础面试题(day02)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Vue2.0 和 Vue3.0 有什么区别&#xff1f;Vue3带来了什么改变&#xff1f;reactive与ref的区别&#xff1f;计算属性computed和watch以及methods的区别&#xff1f;$…

Linux - 进程概念(进程状态、优先级)

1.进程状态操作系统中进程有多种状态模型三态模型进程状态分为 就绪态&#xff0c;执行态&#xff0c;阻塞态。就绪(Ready)状态&#xff1a;指进程已处于准备好运行的状态&#xff0c;即进程已分配到除CPU以外的所有必要资源后&#xff0c;只要再获得CPU&#xff0c;便可立即执…

uniapp 开发微信小程序踩坑:TypeError: Cannot read property ‘FormData‘ of undefined

需求&#xff1a; UniApp 的 H5 端已经正常使用&#xff0c;现在打算兼容微信小程序。 1. 问题分析 本以为应该很顺利&#xff0c;但是一上来就直接报错了&#xff0c;心里很慌呀&#xff0c;报错信息如下&#xff1a; 页面[components/major/major-intro]错误:TypeError: C…

进阶C语言——指针【指针笔试题练习】

文章目录笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8笔试题1 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; }运行结果&#xff1a; ptr-1向前移动一个字节指向5&#xf…