taro(vue)-日期时间选择器picker(有默认)

简介:

Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发 微信 / 京东 / 百度 / 支付宝 / 字节跳动 / QQ 小程序 / H5 等应用。现如今市面上端的形态多种多样,Web、React Native、微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

 前景:

我司某项目某页面需要一个日期时间的五列选择器,我在taro的组件库之picker中找了又找,只发现了mode=date的日期选择器和mode=time的时间选择器,如下:

由于Taro是基于微信小程序仿照的,截图来源如微信小程序的官方demo

需求:

组件库picker功能很完善和强大,日期和时间的都有,然后项目中要求的选择器如下

问题:

what???需要既可以选日期又可以选时间的picker选择器,但目前picker组件只能要么选日期要么选时间,想省事儿的我当时的第一想法就是能不能让设计把时间选择器拆开为两个,这样就直接可以套用原有的组件了。但是我仔细看了下设计,同页面有活动时间和截止时间两个地方需要选择,如果拆开的话,可能样式不是那么美观。再加上技术的角度不能遇到点小困难就换设计(虽然大多数都换不了),下定决心的我决心自己写一个

实现:

仔细看了下组件库的picker,mode=date,mode=time对我是没啥用了,mode=multiSelector自定义的多列选择器,仔细看了下小程序的picker的demo,只需要控制range的数据为[[year],[month],[day],[hour],[minute]],picker组件即可展示出五列。组件库中还有个rangeKey属性,由于页面中展示的选择器一般都是xxx年xx月,但是提交给服务端的一般都是数字,所以该组件我采用的是Object Array结构,[{name:‘1997年’,id:1997}],展示的时候用:rangeKey="'name'",即可展示name的字段,提交数据的时候用id字段。

一、控制数据都为有效数据,默认展示的是起止时间的年月日时分,只需要注意滑动到起始年月日时分和截止年月日时分的时候数据需要通过计算得到然后展示

二、数据年份固定为起止时间的前后xxx年,通过索引来控制有效数据的展示,如果滑到无效数据,则回到(默认,起始,终止)时间的一种,根据滑到数据重置索引来控制选择器的数据都为有效数据

该文章介绍的是第二种思路

具体过程:

要实现第二种能思路的选择器,首先需要准备[year],[month],[day],[hour],[minute]的数据,这块就比第一种思路要简单的多。

**第一步:**获取二维数组activityArray([[year],[month],[day],[hour],[minute]])

[year]:只需要根据起止时间的年份,起始年份-x年,截止年份+x年(项目中x为20),得出一个人数组

[month]:月份固定为1到12月的数组

[day]:日固定为1-31天的数组

[hour]:时固定为0-24的数组

[minute]:固定为0-60的数组

**第二步:**timeIndex(【0,0,0,0,0】的一维数组,分别代表activityArray数组每列的索引)

根据默认时间,计算默认索引defaultIndex,首先取出默认时间的年月日时分,然后拿默认年份去activityArray的year数组中找到它的索引,以此类推,得到月,日,时,分的索引。

根据这个思路依次可以得到起始的索引数组startIndex,截止的索引数组endIndex。

**第三步:**滑动时,如果滑动到无效数据时,重置索引timeIndex

通过columnChange方法监听滑动的行为,当滑动到该时间<起始时间,则重置索引为startIndex。相反该时间>截止时间,则重置索引为endIndex。

代码展示:

**第一步:**dateTimePicker.js 

首选需要一个用来获取[[year],[month],[day],[hour],[minute]]的数据的方法,由于日期是需要每次都重新计算,又避免全局污染,这里我采用了闭包函数,整体代码如下:

var getD
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值