UNPKG

jimu-mobile

Version:

积木组件库助力移动端开发

231 lines (214 loc) 6.36 kB
import React, { Component, } from 'react'; import Picker from './picker.js'; class PickerTime extends Component { constructor() { super(); this.initoptions.bind(this); } onChange(value, text, listIndex) { const val = this.state.value.slice(0); const options = this.state.options.slice(0); const len = this.state.options.length; const { startTime } = this.state; val[listIndex] = text; this.setState({ vallue: val, }); // 首先判断一下是不是三列 if (len === 3) { // 初始化小时的数组 const 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, 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)); } } } const _val = this.state.value.splice(0); _val[2] = marr[0]; options[2] = marr; this.setState({ options, value: _val, }); } } } componentWillReceiveProps(nextprops) { const startTime = nextprops.startTime; if (startTime) { this.setState({ 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, value: [options[0][0], harr[0], marr[0]], }); // this.props.pickerAway([options[0][0], harr[0], marr[0]]) } onClickAway(value, text) { this.props.pickerAway && this.props.pickerAway(this.state.value); } generateM(max) { const arr = []; for (let i = 0; i < max; i++) { const m = i * 5; arr.push(`${m < 10 ? `0${m}` : m}分`); } return arr; } render() { const self = this; const { options, startTime, textvalue, } = this.props; const valueArr = []; if (!this.state) { options.map(function (sr, index) { valueArr.push(arguments[0][0]); }); this.state = { value: valueArr, startTime, options: this.props.options, pickerAway: this.props.pickerAway, }; if (startTime) { self.initoptions(startTime); } } return; <div> <div className="pickertime">{textvalue}</div> <Picker ref="picker" value={this.state.value} startTime={this.state.startTime} options={this.state.options} onChange={this.onChange.bind(this)} onClickAway={this.onClickAway.bind(this)} /> </div>; } } module.exports = PickerTime;