github 地址 https://github.com/iocool/antminDatePicker

最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS设备上,样式明显不同,因为小程序调用该组件是调用系统原生组件,所以会有一定的差异,另外,小程序提供的日期组件并不满足我当前的业务需求:

  1. 该日期为快递上门时间.

  2. 用户只可选择的日期范围,当日往后 2 天(即 今天, 明天 )的日期,并且时间选择为早上 9 点至下午 18 点间的 10 个小时整点时间.

  3. 由于是快递上门,所以可选择的时间点为当前时间点 2 小时后(比如,现在时间是11点,用户可选择的最早时间为13点).

  4. 如果当前时间晚于下午 18 点,则用户应该可以看到 明天后天 2 天的时间点.

针对以上需求,借助小程序的 picker-view 组件,进行了二次封装,以下是封装后的组件.

示例

项目结构

.
├── README.md
├── app.acss
├── app.js
├── app.json
├── components // 组件目录
│   └── dateTimePicker // 日期组件目录
│   ├── datePickerBase.js // 基础 js 文件,需在使用文件中引入
│   ├── dateTimePicker.acss // 组件默认样式,除非特殊需要,一般不用修改
│   ├── dateTimePicker.axml // 组件默认结构
│   ├── dateTimePicker.js // 组件 js
│   ├── dateTimePicker.json // 组件配置信息
│   └── js
│   ├── handleDateArr.js // 日期数组处理的 js ,用以生成所需的日期数组
│   └── moment.min.js // 时间生成使用 moment.js

└── pages // 示例目录
└── index
├── index.acss
├── index.axml
├── index.js
└── index.json

使用说明

支付宝小程序的组件引用方法,及使用说明,可参照 支付宝 使用自定义组件 查看,也可参照本示例中 pages/index 下的使用方法.

pages/index/index.json 需配置 usingComponents, 填写组件路径

{
"defaultTitle": "日期选择picker demo",
"usingComponents": {
"picker": "../../components/dateTimePicker/dateTimePicker"
}
}

pages/index/index.js 引入基础文件,详细配置及使用说明,参照 js 文件内容


// 引入基础初始
import datePicker from '../../components/dateTimePicker/datePickerBase'

pages/index/index.axml 使用 picker 组件

<picker
title="{{datePicker.title}}"
class="{{datePicker.class}}"
visible="{{datePicker.visible}}"
onHidePicker="hidePicker"
onConfirm="onConfirm"
pickerValue="{{datePicker.defaultValue}}"
/>

其中

title           // 组件标题
class // 组件样式,可以自定义
visible // 组件显示/隐藏
onHidePicker // 隐藏该组件的事件
onConfirm // 点击组件弹窗确定后的事件,onConfirm(str),其中 str 为最终回调的参数,可取到 picker 的值
pickerValue // 默认参数,用来初始的时候用,传入数据是 picker 的索引值,默认(0,0),即 默认选中两列 picker 的第一项

一些其他的说明

  1. 组件的封装过程中,由于采用的是支付宝的 picker-view 所以在界面上没有花过多的时间,主要可能还是日期时间数组的生成需要处理一下,借助了 moment.js 库,对于时间处理上还是很方便的,以下是对处理日期数组 handleDateArr.js 的代码说明.

// 依赖于 moment.js
const Moment = require('./moment.min') /**
* 生成日期时间数组
* @param dayLength // 要生成的天数时长,不传的话,默认生成 1 天
* @param timeSection // 时间区间,默认 10 , 可下单区间早上9点到下午6点,可下单时间在当前小时后2小时
*/
function getDaysArr(dayLength, timeSection){
let _daysArr = [[],[]]
let _dayLength = dayLength || 1
const _timeSection = timeSection || 10
const _nowHour = Moment().format('HH') // 当前时间 小时
const _expressHour = parseInt(_nowHour) + 2 // 可下单时间,当前时间 +2
const _earlyHour = 9 // 最早时间
const _endHour = 19 // 截止时间 for(let i = 0; i < _dayLength; i++){ // 当天时间处理
if( i === 0){ if(_expressHour <= _earlyHour ){ // 早于早上 9点时
_daysArr[1].push(getHoursArr(_earlyHour, _timeSection)) // 处理日期
_daysArr[0].push(Moment().add(i, 'days').format('YYYY-MM-DD')) } else if( _expressHour > _earlyHour && _expressHour < _endHour){ // 晚于早上 9 点, 早于下午 18 点之前
_daysArr[1].push(getHoursArr(_expressHour, (_endHour - _expressHour)))
// 处理日期
_daysArr[0].push(Moment().add(i, 'days').format('YYYY-MM-DD'))
} else if ( _expressHour >= _endHour && _expressHour < 24){ // 超过晚上 19 点之后,日期天数增加一天
_dayLength++ } } else {
// 其他日期时间处理 // 早于早上 9点时
_daysArr[1].push(getHoursArr(_earlyHour, _timeSection))
// 处理日期
_daysArr[0].push(Moment().add(i, 'days').format('YYYY-MM-DD'))
} } /**
* 获取小时时间数组
* @param nowHour // 当前小时
* @param hoursLength // 小时区间长度
*/
function getHoursArr(nowHour, hoursLength) {
let _hoursArr = []
for(let j = 0 ; j < hoursLength; j++){
_hoursArr.push(`${nowHour + j}:00:00`)
}
return _hoursArr
} return _daysArr
} module.exports = {
getDaysArr
}
  1. dateTimePicker.js 文件中使用 handleDateArr.js 的方法

... const { getDaysArr } = require('./js/handleDateArr'); // 引入处理函数 Component({
data: {
...
},
methods: { // 获取日期数据
doGetDaysArr() {
this.setData({
dateTimeData: getDaysArr(2) // 传入参数,需返回的日期天数,2天
});
}
}
});
...

以上就是该组件的基本说明,代码相对比较简单,觉得可以给目前在做支付宝小程序并有相关需要的童鞋参考一下.

支付宝小程序日期选择组件datePicker封装的更多相关文章

  1. taro小程序地址选择组件

    效果图: address_picker.tsx: import Taro, { Component } from '@tarojs/taro' import { View, PickerView, P ...

  2. sencha:日期选择组件datepicker

    来源于<sencha touch权威指南> ------------------------------- 除app.js外,其它内容都与上一篇博客里的内容相同.app.js代码如下: E ...

  3. 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件

    支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ...

  4. 支付宝小程序开发——rich-text富文本组件支持html代码

    前言: 与微信小程序不同,支付宝小程序的富文本组件并不能直接支持html代码,如: 如上,支付宝小程序的富文本组件只支持数组类型,html代码需要使用 mini-html-parser 转换,具体用法 ...

  5. react-native DatePicker日期选择组件的实现

    本教程的实现效果如下: 为了实现其淡入/淡出的覆盖效果, 还有取消按钮, 在此用了一个三方的组件, 大家可以先安装一下: 三方组件的地址:https://github.com/eyaleizenber ...

  6. 日期选择组件(DatePicker)的实现

    一.效果图 日期选择组件大概长这样: 从效果图可以看出,日期选择组件由两部分组成:日历表格和顶部操作栏. 二.日历表格 日期选择组件的核心主体是日历表格: 可以将日历表格表示成一个7️*的二维数组,数 ...

  7. Tarojs+redux支付宝小程序开发攻略

    技术选型 对于习惯react语法的开发者来讲,RN是实现native的必备工具. 我们甚至可以屏蔽官方稳定而强大的配置层,直接上手开发. 而后,同为表层React语法的Rax.Taro这样的开源多端开 ...

  8. 小程序开发过程中常见问题[微信小程序、支付宝小程序]

    目录 一.样式中如何使用background-image呢? 二.使用自适应单位rpx类似于rem,布局尽量使用flex布局 三.万能的{{双大括号,用于在模版中输出变量 四.你想要的基础组件和API ...

  9. 支付宝小程序与微信小程序开发功能和语法糖不同

    最近开始负责公司webapp数据打通支付宝小程序,之前已经打通了微信小程序,现在根据支付宝小程序的开发文档在之前的模板上面做修改. 在修改模板的过程中,总结一下双方功能和语法糖的不同之处. 框架: a ...

随机推荐

  1. Codeforces Round #235 (Div. 2)

    A. Vanya and Cards time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. IT领域的罗马帝国——微软公司

    微软公司从做软件开始,起步很小.但是盖茨确是一直深耕于战略布局,像一个棋局高手,每一步棋都是看了后面几步. 盖茨居然用9年的时间憋出一个win3.0,成功击败了apple. 而这9年拖住apple的居 ...

  3. 强连通图 HDU - 1269

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...

  4. 听SEO大神夜息分享

    今天偶然听说了百度站长平台,又偶然在上面发现了夜息大神的分享(http://zhanzhang.baidu.com/college/videoinfo?id=871). 之前对于SEO的了解只限于减少 ...

  5. HTML表单数据转JSON

    问题描述 后端使用如下方式接收前端传入参数: @PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON ...

  6. angularjs中比较实用的multipleselect选择框

    一. HTML HTML中比较多逻辑代码,修改的时候要注意修改很多绑值的地方. <div class="form-group"> <label class=&qu ...

  7. golang中channels的本质详解,经典!

    原文:https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html The Nature Of Channels In Go 这篇 ...

  8. cisco路由器上的DHCP

    一.实验拓扑 二.具体配置 Router(config)#do sh run Building configuration...   Current configuration : 604 bytes ...

  9. POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13805   Accepted: 5996 Descriptio ...

  10. 1159--Palindrome(dp:回文串变形2)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53431   Accepted: 18454 Desc ...