微信小程序picker组件扩展选择时间到秒插件

创建插件seldatetime

// 插件JS部分
Component({// 一些选项options: {// 样式隔离:apply-shared 父影响子,shared父子相互影响, isolated相互隔离styleIsolation:"isolated",// 允许多个插槽multipleSlots: true},// 组件的对外属性:在 properties 定义段中,属性名采用驼峰写法(propertyName);在 wxml 中,指定属性值时则对应使用连字符写法(property-name="")properties: {// 传递默认选中日期value: String,// 最大时间end: String,// 最小时间start: String},// 组件的内部数据data: {currKey: [],// 当前选中的时间下标item: [],// 当前选中时间,格式[2023, 12, 22, 10, 8]list: [],// 时间多列数据集,格式[[], [], [], [], []]},// 类似于 mixins 和 traits 的组件间代码复用机制behaviors: [],// 组件数据字段监听器,用于监听 properties 和 data 的变化observers:{},// 组件间关系定义relations: {},// 通过组件的外部类实现父组件控制子自己的样式externalClasses: [],// 组件生命周期声明对象lifetimes: {attached(){this._initialize()},moved(){},detached(){}},// 组件所在页面的生命周期声明对象pageLifetimes: {show(){},hide(){},resize(){}},/*** 在组件实例刚刚被创建时执行。* 组件实例刚刚被创建好时, created 生命周期被触发。此时,组件数据 this.data 就是在 Component 构造器中定义的数据 data。 此时还不能调用 setData 。 通常情况下,这个生命周期只应该用于给组件 this 添加一些自定义属性字段*/created(){},/*** 在组件实例进入页面节点树时执行* 在组件完全初始化完毕、进入页面节点树后, attached 生命周期被触发。此时, this.data 已被初始化为组件的当前值。这个生命周期很有用,绝大多数初始化工作可以在这个时机进行  */ attached(){},/*** 在组件在视图层布局完成后执行*/ready(){},/*** 在组件实例被移动到节点树另一个位置时执行*/moved() {},/*** 在组件实例被从页面节点树移除时执行* 在组件离开页面节点树后, detached 生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则 detached 会被触发*/ detached() {},/*** 每当组件方法抛出错误时执行*/error(){},/*** 组件的方法,包括事件响应函数和任意的自定义方法*/methods: {/*** 自定义初始化方法*/_initialize() {this.setData({item: this.datetimeStringToArray(this.data.value || this.getCurrDatetime()),})this.setDatetimeList()},/*** value 改变时触发 change 事件,event.detail = {value}*/changeDatetime(e){this.triggerEvent('change', {value: this.datetimeArrayToString(this.data.item)})},/*** 选择每列时间都会触发*/columnChangeDatetime({ detail }){var column = detail.column;var value = detail.value;this.data.item[column] = parseInt(this.data.list[column][value]);this.setData({item: this.data.item})this.setDatetimeList()},/*** 设置时间列数据集* @param {*} datetime */setDatetimeList(){var datetime = this.data.item;var currYear = new Date().getFullYear();var startArr = this.datetimeStringToArray(this.data.start || (currYear - 100) + '-01-01 01:01');var endArr = this.datetimeStringToArray(this.data.end || (currYear + 100) + '-12-31 24:59');var startStr = startArr.join('');var endStr = endArr.join('');var datetimeStr = datetime.join('');var yearArr = this.getColumnBetweenArray(startArr[0], endArr[0], '年');// 计算开始月var startMonth = (datetimeStr.substr(0, 4) <= startStr.substr(0, 4) ? startArr[1] : 1);// 计算结束月var endMonth = (datetimeStr.substr(0, 4) >= endStr.substr(0, 4) ? endArr[1] : 12);var monthArr = this.getColumnBetweenArray(startMonth, endMonth, '月');// 计算开始日var startDay = (datetimeStr.substr(0, 6) <= startStr.substr(0, 6) ? startArr[2] : 1);// 计算每年这个月的天数var dayCount = new Date(datetime[0], datetime[1], 0).getDate();// 计算结束日var endDay = (datetimeStr.substr(0, 6) >= endStr.substr(0, 6) ? endArr[2] : dayCount);var dayArr = this.getColumnBetweenArray(startDay, endDay, '日');// 计算开始小时var startHour = (datetimeStr.substr(0, 8) <= startStr.substr(0, 8) ? startArr[3] : 1);// 计算结束小时var endHour = (datetimeStr.substr(0, 8) >= endStr.substr(0, 8) ? endArr[3] : 24);var hourArr = this.getColumnBetweenArray(startHour, endHour, '时');// 计算开始分钟var startMinute = (datetimeStr.substr(0, 10) <= startStr.substr(0, 10) ? startArr[4] : 1);// 计算结束分钟var endMinute = (datetimeStr.substr(0, 10) >= endStr.substr(0, 10) ? endArr[4] : 59);var minuteArr = this.getColumnBetweenArray(startMinute, endMinute, '分');// 计算当前时间的下标var yearKey = this.getKey(yearArr, datetime[0]);var monthKey = this.getKey(monthArr, datetime[1])var dayKey = this.getKey(dayArr, datetime[2])var hourKey = this.getKey(hourArr, datetime[3])var minuteKey = this.getKey(minuteArr, datetime[4])this.setData({currKey: [yearKey, monthKey, dayKey, hourKey, minuteKey],list: [yearArr, monthArr, dayArr, hourArr, minuteArr],item: [parseInt(yearArr[yearKey]), parseInt(monthArr[monthKey]), parseInt(dayArr[dayKey]), parseInt(hourArr[hourKey]), parseInt(minuteArr[minuteKey])]})},/*** 获取数值之间数据列表* @param {*} start * @param {*} end */getColumnBetweenArray(start, end, unit){var resArray = [];for(var i = start;i <= end; i++){resArray.push(this.zeroize(i) + unit);}return resArray;},/*** 获取KEY* @param {*} array * @param {*} item */getKey(array, item){var key = array.findIndex(value => parseInt(item) == parseInt(value));if(key === -1){return 0;}return key;},/*** 补零* @param {*} number */zeroize(number){return number < 10 ? '0' + number : number;},/*** 获取当前时间*/getCurrDatetime(){var d = new Date();var year = d.getFullYear()var month = d.getMonth() + 1var day = d.getDate();var hours = d.getHours()var minutes = d.getMinutes()return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes;},/*** 时间字符串转数组* @param {*} datetime */datetimeStringToArray(datetime){return datetime.replace(/-|:/g, ' ').split(' ').map(item => parseInt(item));},/*** 时间数组转字符串* @param {*} datetime */datetimeArrayToString(datetime){return datetime[0] + '-' + datetime[1] + '-' + datetime[2] + ' ' + datetime[3] + ':' + datetime[4]}},
})// wxml部分
<picker mode="multiSelector" range="{{ list }}" value="{{ currKey }}" bindchange="changeDatetime" bindcolumnchange="columnChangeDatetime"><slot></slot>
</picker>

app.json配置

"usingComponents": {"d-demo": "../../components/seldatetime/index"
},

page页面中调用

// wxml文件内容
<d-demo value="{{ value }}" start="2020-01-01 05:20" end="2060-12-30 18:51" bindchange="selectDatetime"><input value="{{ value }}" placeholder="请选择时间" style="border: 1px solid #e2e2e2;padding: 10px;border-radius: 5px;"  />
</d-demo>// JS文件内容
Page({/*** 页面的初始数据*/data: {value: '2023-12-22 16:50',},/*** 选择时间*/selectDatetime(e){var d = e.detailthis.setData({value: d.value})}
})

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

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

相关文章

前端项目重构的深度思考和复盘

摘要&#xff1a; 项目重构是每一家稳定发展的互联企业的必经之路, 就像一个产品的诞生, 会经历产品试错和产品迭代 一样, 随着业务或新技术的不断发展, 已有架构已无法满足更多业务扩展的需求, 所以只有通过重构来让产品“进化”, 才能跟上飞速发展的时代浪潮. 技术因素 早期…

人工智能:网络犯罪分子的驱动力

随着 2024 年的临近&#xff0c;是时候展望今年的网络安全状况了。由于网络犯罪日益复杂&#xff0c;预计到 2025 年&#xff0c;全球网络安全成本将增至 10.5 万亿美元。 人工智能的使用不断发展&#xff0c;网络犯罪分子变得越来越有创造力 我们注意到&#xff0c;联邦调查…

用C的递归函数求n!-----(C每日一编程)

用递归函数求n&#xff01; 有了上面这个递归公式就能写C代码了。 参考代码&#xff1a; int fac(int n) {if (n 1 || n 0)return 1;else return n * fac(n - 1); } void main() {int n;scanf("%d",&n);int f fac(n);printf("\n%d!%d\n", n, f); …

119. 杨辉三角 II(Java)

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

ARM Cortex-A学习(1):GIC(通用中断控制器)详解

文章目录 1 Cortex-A核中断1.1 处理器模式1.2 IRQ模式 2 GIC的操作2.1 CPU Interface2.2 Distributor GIC(通用中断控制器, Generic Interrupt Controller)是一种用于处理中断的硬件组件&#xff0c;它的主要功能是协调和管理系统中的中断请求&#xff0c;确保它们被正确地传递…

VMware安装linux系统二

1、设置光驱 1.1、编辑虚拟机设置 1.2、设置虚拟机镜像 1.3、设置好后开机 2、安装Linux系统 2.1、等待安装 2.2、开始安装 2.3、选择语言&#xff0c;我选择中文 2.4、本地化不用改 2.5、软件选择一定要选&#xff0c;否则就会是默认最小安装 2.6、我这里选择的是带GUI的&am…

VMvare虚拟机之文件夹共享防火墙设置

目录 一.jdk的配置&TomCat的配置 1.1 jdk配置 1.2 tomcat配置 二.文件夹共享功能 2.1 作用 2.2.高级共享和普通共享 三.防火墙设置 3.1 入站规则和出站规则 四.附图-思维导图 一.jdk的配置&TomCat的配置 建立一个共享文件夹&#xff0c;将jdk文件和tomcat文…

现代 NLP:详细概述,第 1 部分:transformer

阿比吉特罗伊 一、说明 近五年来&#xff0c;随着 BERT 和 GPT 等思想的引入&#xff0c;我们在自然语言处理领域取得了巨大的成就。在本文中&#xff0c;我们的目标是逐步深入研究改进的细节&#xff0c;并了解它们带来的演变。 二、关注就是你所需要的 2017 年&#xff0c;来…

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.…

H266/VVC帧间预测编码技术概述

帧间预测编码简述 帧间预测利用视频时间域的相关性&#xff0c;使用邻近已编码图像像素值预测当前图像的像素值&#xff0c;能有效去除视频时域冗余。 目前主要的视频编码标准中&#xff0c;帧间预测都采用基于块的运动补偿技术&#xff0c;不同的编码标准有不同的分块方式。 …

【UML】第12篇 序列图(1/2)——基本概念和构成

目录 一、什么是序列图&#xff08;Sequence Diagram&#xff09; 1.1 定义 1.2 主要用途 1.3 序列图和BPMN的区别和联系 二、序列图的构成 2.1 对象 2.2 生命线 2.3 消息 2.4 激活 序列图&#xff0c;是我个人认为的用处最多的一种图。产品和研发的同学&#xff0c;都…

CentOS安装MongoDB

CentOS安装MongoDB 文章目录 CentOS安装MongoDB1. 安装并运行2. 创建用户/密码3. 测试语句4. 允许外网访问 1. 安装并运行 在 CentOS 上安装 MongoDB&#xff0c;你可以按照以下步骤进行&#xff1a; 导入 MongoDB 的 GPG 密钥&#xff1a; sudo rpm --import https://www.mon…