jimu-mobile
Version:
积木组件库助力移动端开发
470 lines (444 loc) • 14.5 kB
JavaScript
import React, { Component} from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
import Picker from '../picker/picker.js'
class PickerTime extends Component {
constructor () {
super()
this.initoptions = this.initoptions.bind(this)
}
// getDefaultProps: function() {
// return {
// options: 'default value'
// }
// }
static propTypes = {
// value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array]).isRequired,
// options: PropTypes.array.isRequired,
// onChange: PropTypes.func,
// onShow: PropTypes.func,
// onDismiss: PropTypes.func,
// onClickAway: PropTypes.func,
// width: PropTypes.string
options: PropTypes.object.isRequired
}
componentWillMount () {
let {startTime, endTime, scale, value, day, open} = this.props.options
// 默认5分钟的刻度
scale = scale || 5
day = day || 3
open = open || false
let alloptions,dayarr = [],marr = [],harr = []
// options 全值
for (let i = 0; i < day; i++) {
switch (i) {
case 0:
dayarr.push('今日')
break
case 1:
dayarr.push('次日')
break
case 2:
dayarr.push('后天')
break
default:
dayarr.push(this._getDay(i))
break
}
}
for (let i = 0;i < 60;i++) {
if (i < 24) {
harr.push((i < 10 ? '0' + i : i) + '时')
}
if (!(i % scale)) {
marr.push((i < 10 ? '0' + i : i) + '分')
}
}
alloptions = [dayarr, harr, marr]
this.setState({
alloptions: alloptions
})
this._getoptionvalue(alloptions, startTime, endTime, scale, value, day, open)
}
generateM (max) {
let arr = []
for (let i = 0;i < max;i++) {
const m = i * 5
arr.push((m < 10 ? '0' + m : m) + '分')
}
return arr
}
generateH (ax) {}
onChange (value, text, listIndex) {
let val = this.state.value.slice(0),
options = this.state.options.slice(0),
len = this.state.options.length,
starttime = this.state.starttime,
newvalue,
daylength = options[0].length
const {alloptions, endtime, scale, day} = this.state
// day变化
if (len === 3 && listIndex === 0) {
// 天数的位置
// day不可能只有一天 否则无change
let dayindex = options[0].indexOf(value)
if (dayindex === 0 && starttime) {
// 第一天并且有start值并且最后一天和第一天不是同一天
let startTimeD = parseInt(starttime[0]),
startTimeH = parseInt(starttime[1]),
startTimeM = parseInt(starttime[2])
let lastmin = parseInt(alloptions[2][alloptions[2].length - 1].substr(0, 2))
if (lastmin < startTimeM) {
startTimeH++
startTimeM = 0
}
if (startTimeH > 23) {
startTimeD++
startTimeH = 0
}
options = [options[0], alloptions[1].slice(startTimeH), alloptions[2].slice(Math.ceil(startTimeM / scale))]
}else if (dayindex === daylength - 1 && endtime) {
// 最后一天并且有end值
let endTimeD = parseInt(endtime[0]),
endTimeH = parseInt(endtime[1]),
endTimeM = parseInt(endtime[2])
options = [options[0], alloptions[1].slice(0, endTimeH + 1), alloptions[2].slice(0, Math.ceil((endTimeM + 1) / scale))]
}else {
// hour min为全值
options = [options[0], alloptions[1], alloptions[2]]
}
newvalue = [value, options[1][0], options[2][0]]
this.setState({
options: options,
value: newvalue
})
}else if ((len === 3 && listIndex === 1) || (len === 2 && listIndex === 0)) {
// hour变化
let dayindex = options[0].indexOf(val[0]),
hourindex = options[1].indexOf(val[1]),
hourlen = options[1].length
if (dayindex === 0 && hourindex === 0 && starttime) {
// 第一天 第一个hour 并且有start值
let startTimeD = parseInt(starttime[0]),
startTimeH = parseInt(starttime[1]),
startTimeM = parseInt(starttime[2])
let lastmin = parseInt(alloptions[2][alloptions[2].length - 1].substr(0, 2))
if (lastmin < startTimeM) {
startTimeH++
startTimeM = 0
}
if (startTimeH > 23) {
startTimeD++
startTimeH = 0
}
// newvalue = [val[0] ,alloptions[1][0],alloptions[2]]
options = [options[0], options[1], alloptions[2].slice(Math.ceil(startTimeM / scale))]
}else if (dayindex === daylength - 1 && hourindex === hourlen - 1 && endtime) {
// 最后一天 最后一个hour 并且有end值
let endTimeM = parseInt(endtime[2])
options = [options[0], options[1], alloptions[2].slice(0, Math.ceil((endTimeM + 1) / scale))]
// newvalue = [val[0] ,alloptions[1][0],alloptions[2]]
}else {
// hour da不变 min为全值
options = [options[0], options[1], alloptions[2]]
}
newvalue = [val[0], value, options[2][0]]
this.setState({
options: options,
value: newvalue
})
}
// val[listIndex]=text
// this.setState({
// value:val
// })
// 首先判断一下是不是三列
// if(len===3){
// //初始化小时的数组
// let harr=[]
// //初始化分钟的数组
// let marr=[]
// //把开始时间分解
// const startArr=startTime.split(":")
// //获取到开始时间的小时
// const startTimeH=parseInt(startArr[0])
// //获取到开始时间的分钟
// const startTimeM=parseInt(startArr[1])
//
// //滑动的时候判读一下是不是第一项
// if(listIndex===0){
// //如果是当日的话
// if(value==="当日"){
// //选日的时候只触发时的重新渲染
// //初始化一下最小值
// this.initoptions(startTime)
// }else if (value === "次日"){
// //初始化一下最小值
// //初始化开始小时
// let maxH=startTimeH
// //如果分钟为0的时候,最大小时数要减一
// if(startTimeM===0){
// maxH--
// }
// //开始初始化时小时数组
// for(let i=0;i<=maxH;i++){
// harr.push((i<10?"0"+i:i)+"时")
// }
// //开始初始化时小时数组
// if(maxH === 0){
// if(startTimeM===0){
// marr=this.generateM(12)
// }else{
// marr=this.generateM((startTimeM/5))
// }
// }else{
// marr=this.generateM(12)
// }
// options[1]=harr
// options[2]=marr
// this.setState({
// options:options,
// value:[options[0][1], harr[0], marr[0]]
// })
// }
// //如果滑动的是小时的话
// }else if (listIndex===1){
// if(this.state.value[0]==="当日"){
// marr=this.generateM(12)
// //如果是55则不用管,因为下一个是从00开始
// if(startTimeM!=55){
// //循环全部分钟值
// if(parseInt(value)==startTimeH){
// marr=[]
// //如果是第一项的话 并且上一项的分钟不是55
// for(let i=(startTimeM/5+1);i<12;i++){
// const m=i*5
// marr.push((m<10?"0"+m:m)+"分")
// }
// }
// }
// }else if (this.state.value[0]==="次日"){
// //先按默认来循环一遍
// marr=this.generateM(12)
// if(startTimeM!=0){
// if(parseInt(value)==startTimeH){
// marr=this.generateM((startTimeM/5))
// }
// }
// }
// let _val=this.state.value.splice(0)
// _val[2]=marr[0]
// options[2]=marr
// this.setState({
// options:options,
// value:_val
// })
// }
// }
}
componentWillReceiveProps (nextprops) {
const startTime = nextprops.startTime
if (startTime) {
this.setState({
startTime: startTime
})
this.initoptions(startTime)
}
}
initoptions (startTime) {
const startArr = startTime.split(':')
const startTimeH = parseInt(startArr[0])
const startTimeM = parseInt(startArr[1])
const options = this.state.options.slice(0)
const harr = []
const marr = []
// 选日的时候只触发时的重新渲染
// 初始化一下最小值
let minH = startTimeH
if (startTimeM === 55) {
// 如果是55的话,则加小时往后加1
minH++
}
for (let i = minH;i < 24;i++) {
// 初始化小时
harr.push((i < 10 ? '0' + i : i) + '时')
}
if (startTimeM != 55) {
// 如果是第一项的话 并且上一项的分钟不是时间正常计算
for (let i = (startTimeM / 5 + 1);i < 12;i++) {
// 初始化第一项的分钟
const m = i * 5
marr.push((m < 10 ? '0' + m : m) + '分')
}
if (startTimeM == 0 && startTimeH == 0) {
// 分钟和时间都为0的时候,不显示次日
options[0] = ['当日']
}else {
options[0] = ['当日', '次日']
}
}else {
// 如果时间是55
// 如果小时等于23点
if (startTimeH == 23) {
// 那只能选次日
options[0] = ['次日']
// 初始化小时
for (let i = 0;i < 24;i++) {
harr.push((i < 10 ? '0' + i : i) + '时')
}
}
// 分钟按正常逻辑处理
for (let i = 0;i < 12;i++) {
const m = i * 5
marr.push((m < 10 ? '0' + m : m) + '分')
}
}
options[1] = harr
options[2] = marr
this.setState({
options: options,
value: [options[0][0], harr[0], marr[0]]
})
// this.props.pickerAway([options[0][0], harr[0], marr[0]])
}
onClickAway (value, text, listIndex) {
this.props.pickerAway && this.props.pickerAway(this.state.value, this.refs.pickertime)
}
render () {
const self = this
const {textvalue} = this.props
if (!this.state) {
// if(startTime){
// self.initoptions(startTime)
// }
}
return <div>
<div className='pickertime' onClick={this._onClick.bind(this)} ref='pickertime'>
{textvalue}
</div>
<Picker
ref='picker'
value={this.state.value}
options={this.state.options}
onChange={this.onChange.bind(this)}
onClickAway={this.onClickAway.bind(this)}
open={this.state.open} />
</div>
}
_onClick () {
this.refs.picker.show()
}
show () {
this.refs.picker.show()
}
_compare (startTime, endTime) {
if (startTime && endTime) {
let result = 0
startTime.forEach(function (item, i) {
if ((startTime[i] > endTime[i]) && result == 0) {
result = 1
}else if ((startTime[i] < endTime[i]) && result == 0) {
result = 2
}
})
if (result == 2) return true
else return false
}else {
return true
}
}
_setTimeForStart (startTime, options) {}
_getDay (i) {
let today = new Date()
}
// 初始化iotions
_getoptionvalue (alloptions, startTime, endTime, scale, value, day, open) {
let options,valuearr = []
let dayarr ,harr ,marr
// let dayarr = alloptions[0],harr = alloptions[1],marr = alloptions[2]
// let alldayarr, allharr, allmarr
if (startTime && !endTime) {
let startTimeD = parseInt(startTime[0]),
startTimeH = parseInt(startTime[1]),
startTimeM = parseInt(startTime[2])
let lastmin = parseInt(alloptions[2][alloptions[2].length - 1].substr(0, 2))
if (lastmin < startTimeM) {
startTimeH++
startTimeM = 0
}
if (startTimeH > 23) {
startTimeD++
startTimeH = 0
}
dayarr = alloptions[0].slice(startTimeD)
harr = alloptions[1].slice(startTimeH)
marr = alloptions[2].slice(Math.ceil(startTimeM / scale))
}else if (endTime && !startTime) {
let endTimeD = parseInt(endTime[0]),
endTimeH = parseInt(endTime[1]),
endTimeM = parseInt(endTime[2])
dayarr = alloptions[0].slice(0, endTimeD)
harr = alloptions[1].slice(0, endTimeH)
marr = alloptions[2].slice(0, Math.ceil(endTimeM / scale))
}else if (endTime && startTime) {
if (this._compare(startTime, endTime)) {
let startTimeD = parseInt(startTime[0]),
startTimeH = parseInt(startTime[1]),
startTimeM = parseInt(startTime[2]),
endTimeD = parseInt(endTime[0]),
endTimeH = parseInt(endTime[1]),
endTimeM = parseInt(endTime[2])
// 判断极端情况的开始值
let lastmin = parseInt(alloptions[2][alloptions[2].length - 1].substr(0, 2))
if (lastmin < startTimeM) {
startTimeH++
startTimeM = 0
}
if (startTimeH > 23) {
startTimeD++
startTimeH = 0
}
// 分别判断同一天 同一小时的情况
if (startTimeD != endTimeD) {
dayarr = alloptions[0].slice(startTimeD, endTimeD)
harr = alloptions[1].slice(startTimeH)
marr = alloptions[2].slice(Math.ceil(startTimeM / scale))
}else if (startTimeH != endTimeH) {
dayarr = [alloptions[0][startTimeD]]
harr = alloptions[1].slice(startTimeH, endTimeH)
marr = alloptions[2].slice(Math.ceil(startTimeM / scale))
}else {
dayarr = [alloptions[0][startTimeD]]
harr = [alloptions[1][startTimeH]]
marr = alloptions[2].slice(Math.ceil(startTimeM / scale), Math.ceil(endTimeM / scale) + 1)
}
}
}else {
dayarr = alloptions[0]
harr = alloptions[1]
marr = alloptions[2]
}
if (dayarr.length > 0) {
options = [dayarr, harr, marr]
}else {
options = [harr, marr]
}
if (value) {
valuearr = value.splice(':')
}else {
valuearr = [options[0][0], options[1][0], options[2][0]]
}
this.setState({
value: valuearr,
alloptions: alloptions,
options: options,
starttime: startTime,
endtime: endTime,
scale: scale,
day: day,
open: open,
pickerAway: this.props.pickerAway
})
}
}
module.exports = PickerTime