时间组件

/**

 @Author: YE

 @Update: 2018-09-17

 @param: format<string>, onInputChange<function>(v:input框内值), handleNext<function>:回车跳转下一个

 @Description: 时间手动输入框,其中onInputChange为必传项用来接收input框时间值。

 */

import React, { Component } from 'react';

import { Input, Message, DatePicker } from '@alifd/next';

import { MsgBox } from '@ali/seenew-front';

import moment from 'moment';

import './index.scss';

let selectPosition = 0;

// const Toast = Feedback.toast;

export default class DateInput extends Component {

  constructor(props) {

    super(props);

    this.state = {

      value: props.value || props.defaultValue,

      oldValue: props.value || props.defaultValue,

      visible: false,

    };

  }

  // 判断平年闰年

  isLeapYear = (year) => {

    let isLeap = false;

    if ((year % 100 === 0 && year % 400 === 0) || (year % 4 === 0 && year % 100 !== 0)) {

      isLeap = true;

    }

    return isLeap;

  }

  handKeyCodeMin = (ele, parts, type) => {

    if ([0, 1, 2, 3, 4].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[0] = Number(parts[0]) - 1;

      } else {

        parts[0] = Number(parts[0]) + 1;

      }

      const val = `${parts[0]}-${parts[1]}-${parts[2]} ${parts[3]}:${parts[4]}`;

      this.setState({

        value: val,

        oldValue: val,

      }, () => {

        ele.setSelectionRange(0, 4);

        selectPosition = 1;

      });

    } if ([5, 6, 7].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[1] = Number(parts[1]) - 1;

        if (parts[1] < 10 && parts[1] > 0) {

          parts[1] = `0${parts[1]}`;

        } if (parts[1] < 1) {

          parts[1] = 12;

        }

      } else {

        parts[1] = Number(parts[1]) + 1;

        if (parts[1] < 10) {

          parts[1] = `0${parts[1]}`;

        } if (parts[1] > 12) {

          parts[1] = '01';

        }

      }

      const val = `${parts[0]}-${parts[1]}-${parts[2]} ${parts[3]}:${parts[4]}`;

      this.setState({

        value: val,

        oldValue: val,

      }, () => {

        ele.setSelectionRange(5, 7);

        selectPosition = 2;

      });

    } if ([8, 9, 10].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[2] = Number(parts[2]) - 1;

        if (parts[2] < 10 && parts[2] > 0) {

          parts[2] = `0${parts[2]}`;

        } if (parts[2] < 1 && ['01', '03', '05', '07', '08', '10', '12'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = 31;

        } if (parts[2] < 1 && ['04', '06', '09', '11'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = 30;

        } if (Number(parts[1]) === 2 && this.isLeapYear(parts[0]) && parts[2] < 1) {

          parts[2] = 29;

        } if (Number(parts[1]) === 2 && !this.isLeapYear(parts[0]) && parts[2] < 1) {

          parts[2] = 28;

        }

      } else {

        parts[2] = Number(parts[2]) + 1;

        if (parts[2] < 10) {

          parts[2] = `0${parts[2]}`;

        } if (parts[2] > 30 && ['04', '06', '09', '11'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = '01';

        } if (parts[2] > 31 && ['01', '03', '05', '07', '08', '10', '12'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = '01';

        } if (Number(parts[1]) === 2 && this.isLeapYear(parts[0]) && parts[2] > 29) {

          parts[2] = '01';

        } if (Number(parts[1]) === 2 && !this.isLeapYear(parts[0]) && parts[2] > 28) {

          parts[2] = '01';

        }

      }

      const val = `${parts[0]}-${parts[1]}-${parts[2]} ${parts[3]}:${parts[4]}`;

      this.setState({

        value: val,

        oldValue: val,

      }, () => {

        ele.setSelectionRange(8, 10);

        selectPosition = 3;

      });

    } if ([11, 12, 13].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[3] = Number(parts[3]) - 1;

        if (parts[3] < 10 && parts[3] >= 0) {

          parts[3] = `0${parts[3]}`;

        } if (parts[3] < 0) {

          parts[3] = '23';

        }

      } else {

        parts[3] = Number(parts[3]) + 1;

        if (parts[3] < 10) {

          parts[3] = `0${parts[3]}`;

        } if (parts[3] > 23) {

          parts[3] = '00';

        }

      }

      const val = `${parts[0]}-${parts[1]}-${parts[2]} ${parts[3]}:${parts[4]}`;

      this.setState({

        value: val,

        oldValue: val,

      }, () => {

        ele.setSelectionRange(11, 13);

        selectPosition = 4;

      });

    } if ([14, 15, 16].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[4] = Number(parts[4]) - 1;

        if (parts[4] < 10 && parts[4] >= 0) {

          parts[4] = `0${parts[4]}`;

        } if (parts[4] < 0) {

          parts[4] = '59';

        }

      } else {

        parts[4] = Number(parts[4]) + 1;

        if (parts[4] < 10) {

          parts[4] = `0${parts[4]}`;

        } if (parts[4] > 59) {

          parts[4] = '00';

        }

      }

      const val = `${parts[0]}-${parts[1]}-${parts[2]} ${parts[3]}:${parts[4]}`;

      this.setState({

        value: val,

        oldValue: val,

      }, () => {

        ele.setSelectionRange(14, 16);

        selectPosition = 5;

      });

    }

  }

  handKeyCode = (ele, parts, type) => {

    if ([0, 1, 2, 3, 4].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[0] = Number(parts[0]) - 1;

      } else {

        parts[0] = Number(parts[0]) + 1;

      }

      this.setState({

        value: parts.join('-'),

        oldValue: parts.join('-'),

      }, () => { ele.setSelectionRange(0, 4); selectPosition = 1; });

    } if ([5, 6, 7].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[1] = Number(parts[1]) - 1;

        if (parts[1] < 10 && parts[1] > 0) {

          parts[1] = `0${parts[1]}`;

        } if (parts[1] < 1) {

          parts[1] = 12;

        }

      } else {

        parts[1] = Number(parts[1]) + 1;

        if (parts[1] < 10) {

          parts[1] = `0${parts[1]}`;

        } if (parts[1] > 12) {

          parts[1] = '01';

        }

      }

      this.setState({

        value: parts.join('-'),

        oldValue: parts.join('-'),

      }, () => { ele.setSelectionRange(5, 7); selectPosition = 2; });

    } if ([8, 9, 10].some(item => item === ele.selectionStart)) {

      if (type === 'minus') {

        parts[2] = Number(parts[2]) - 1;

        if (parts[2] < 10 && parts[2] > 0) {

          parts[2] = `0${parts[2]}`;

        } if (parts[2] < 1 && ['01', '03', '05', '07', '08', '10', '12'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = 31;

        } if (parts[2] < 1 && ['04', '06', '09', '11'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = 30;

        } if (Number(parts[1]) === 2 && this.isLeapYear(parts[0]) && parts[2] < 1) {

          parts[2] = 29;

        } if (Number(parts[1]) === 2 && !this.isLeapYear(parts[0]) && parts[2] < 1) {

          parts[2] = 28;

        }

      } else {

        parts[2] = Number(parts[2]) + 1;

        if (parts[2] < 10) {

          parts[2] = `0${parts[2]}`;

        } if (parts[2] > 30 && ['04', '06', '09', '11'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = '01';

        } if (parts[2] > 31 && ['01', '03', '05', '07', '08', '10', '12'].some(item => Number(item) === Number(parts[1]))) {

          parts[2] = '01';

        } if (Number(parts[1]) === 2 && this.isLeapYear(parts[0]) && parts[2] > 29) {

          parts[2] = '01';

        } if (Number(parts[1]) === 2 && !this.isLeapYear(parts[0]) && parts[2] > 28) {

          parts[2] = '01';

        }

      }

      this.setState({

        value: parts.join('-'),

        oldValue: parts.join('-'),

      }, () => { ele.setSelectionRange(8, 10); selectPosition = 3; });

    }

  }

  handleChange = (v, e) => {

    const { format } = this.props;

    if (v === '') {

      this.setState({

        value: v,

      });

      selectPosition = 0;

      return;

    }

    if (format === 'YYYY-MM-DD HH:mm') {

      if (selectPosition === 1) {

        // v = v.replace(/\D/g, '');

        const pis = v.split('-');

        if (pis[0].length === 4) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(5, 7);

          selectPosition = 2;

        } else {

          // v = v.replace(/\D/, '');

          this.setState({

            value: v,

          });

        }

        return;

      }

      if (selectPosition === 2) {

        // v = v.replace(/\D/g, '');

        const pis = v.split('-');

        if (pis[1].length === 2) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(8, 10);

          selectPosition = 3;

        }

        this.setState({

          value: v,

        });

        return;

      }

      if (selectPosition === 3) {

        // v = v.replace(/\D/g, '');

        const d = v.split(' ');

        const pis = d[0] ? d[0].split('-') : [];

        if (pis[2] && pis[2].length === 2) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(11, 13);

          selectPosition = 4;

        }

        this.setState({

          value: v,

        });

        return;

      }

      if (selectPosition === 4) {

        // v = v.replace(/\D/g, '');

        const pis = v.split(' ');

        const times = pis[1] ? pis[1].split(':') : [];

        if (times[0] && times[0].length === 2) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(14, 16);

          selectPosition = 5;

        }

        this.setState({

          value: v,

        });

        return;

      }

      if (selectPosition === 5) {

        // v = v.replace(/\D/g, '');

        // const pis = v.split(' ');

        // const times = pis[1] ? pis[1].split(':') : [];

        // if (times[1] && times[1].length === 2) {

        //   this.setState({

        //     value: v,

        //     oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(`${pis[0]} ${times[0]}:${mins[0]}${mins[1]}`) ? `${pis[0]} ${times[0]}:${mins[0]}${mins[1]}` : this.state.oldValue,

        //   });

        //   e.target.setSelectionRange(14, 16);

        //   selectPosition = 5;

        // }

        // this.setState({

        //   value: v,

        // });

        // return;

        const pis = v.split(' ');

        const times = pis[1] ? pis[1].split(':') : [];

        if (times[1]) {

          const mins = times[1].split('');

          if (mins[0]) {

            mins[0] = mins[0].replace(/[^0-5]/, '');

          } if (mins[1]) {

            mins[1].replace(/[^0-9]/, '');

          }

          this.setState({

            value: `${pis[0]} ${times[0]}:${mins[0] || ''}${mins[1] || ''}`,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(`${pis[0]} ${times[0]}:${mins[0]}${mins[1]}`) ? `${pis[0]} ${times[0]}:${mins[0]}${mins[1]}` : this.state.oldValue,

          });

          if (mins.length === 2) {

            e.target.setSelectionRange(14, 16);

            selectPosition = 5;

          }

          return;

        }

        this.setState({

          value: v,

        });

        return;

      }

    } else {

      if (selectPosition === 1) {

        // v = v.replace(/\D/g, '');

        const pis = v.split('-');

        if (pis[0].length === 4) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(5, 7);

          selectPosition = 2;

        }

        this.setState({

          value: v,

        });

        return;

      }

      if (selectPosition === 2) {

        // v = v.replace(/\D/g, '');

        const pis = v.split('-');

        if (pis[1].length === 2) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(8, 10);

          selectPosition = 3;

        }

        this.setState({

          value: v,

        });

        return;

      }

      if (selectPosition === 3) {

        // v = v.replace(/\D/g, '');

        const d = v.split(' ');

        const pis = d[0] ? d[0].split('-') : [];

        if (pis[2] && pis[2].length === 2) {

          this.setState({

            value: v,

            oldValue: /^[1-9]\d{3}-\d{2}-\d{2}/.test(v) ? v : this.state.oldValue,

          });

          e.target.setSelectionRange(8, 10);

          selectPosition = 4;

        }

        this.setState({

          value: v,

        });

        return;

      }

    }

    v = v.replace(/\D/g, '');

    this.setState({

      value: v,

    });

    const parts = v.split('');

    let $time = '';

    // yyyy-mm-dd hh:mm

    if (parts[0] && !parts[1]) {

      $time = `${parts[0]}`;

      $time = $time.replace(/[^1-9]/, '');

      this.setState({

        value: $time,

      });

    } if (parts[1]) {

      $time = `${parts[0] + parts[1]}`;

    } if (parts[2]) {

      $time = `${parts[0] + parts[1] + parts[2]}`;

    } if (parts[3]) {

      $time = `${parts[0] + parts[1] + parts[2] + parts[3]}`;

    } if (parts[4]) {

      // 月份十位数只能输入0-1

      const partFour = parts[4].replace(/[^0-1]/, '');

      $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${partFour}`}`;

      this.setState({

        value: $time,

      });

    } if (parts[5]) {

      if (parts[4] * 1 === 1 && parts[5] > 2) {

        parts[5] = '';

      } if (parts[4] * 1 === 0 && parts[5] * 1 === 0) {

        parts[5] = '';

      }

      $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}`}`;

      this.setState({

        value: $time,

      });

    } if (parts[6]) {

      let partSix;

      // 2月单独处理

      if (parts[4] * 1 === 0 && parts[5] * 1 === 2) {

        partSix = parts[6].replace(/[^0-2]/, '');

      } else {

        // 天数十位数只能输入0-3

        partSix = parts[6].replace(/[^0-3]/, '');

      }

      $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${partSix}`}`;

      this.setState({

        value: $time,

      });

    } if (parts[7]) {

      // 天数个位数处理

      const yearPart = `${parts[0] + parts[1] + parts[2] + parts[3]}`;

      const monthPart = `${parts[4]}${parts[5]}`;

      let partSeven = parts[7];

      const isOk = this.isLeapYear(yearPart);

      if (parts[6] === '0') {

        partSeven = parts[7].replace(/[^1-9]/, '');

      }

      /** 闰年 */

      if (isOk && monthPart === '02') {

        partSeven = parts[7];

      }

      /** 平年 */

      if (!isOk && monthPart === '02') {

        partSeven = parts[7].replace(/[^0-8]/, '');

      } if ((monthPart === '01' || monthPart === '03' || monthPart === '05' || monthPart === '07' || monthPart === '08' || monthPart === '10' || monthPart === '12') && parts[6] === '3') {

        partSeven = parts[7].replace(/[^0-1]/, '');

      } if ((monthPart === '04' || monthPart === '06' || monthPart === '09' || monthPart === '11') && parts[6] === '3') {

        partSeven = parts[7].replace(/[1-9]/, '');

      }

      $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${parts[6]}${partSeven}`}`;

      this.setState({

        value: $time,

        oldValue: $time,

      });

      // 带时间

      if (format === 'YYYY-MM-DD HH:mm') {

        if (parts[8]) {

          const partEight = parts[8].replace(/[^0-2]/, '');

          $time = ` ${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${parts[6]}${parts[7]}`} ${partEight}`;

          this.setState({

            value: $time,

          });

        } if (parts[9]) {

          let partNine;

          if (parts[8] === '2') {

            partNine = parts[9].replace(/[^0-3]/, '');

          } else {

            partNine = parts[9];

          }

          $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${parts[6]}${parts[7]}`} ${parts[8]}${partNine}`;

          this.setState({

            value: $time,

          });

        } if (parts[10]) {

          const partTen = parts[10].replace(/[^0-5]/, '');

          $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${parts[6]}${parts[7]}`} ${parts[8]}${parts[9]}:${partTen}`;

          this.setState({

            value: $time,

          });

        } if (parts[11]) {

          $time = `${`${parts[0] + parts[1] + parts[2] + parts[3]}-${parts[4]}${parts[5]}-${parts[6]}${parts[7]}`} ${parts[8]}${parts[9]}:${parts[10]}${parts[11]}`;

          this.setState({

            value: $time,

            oldValue: $time,

          });

        }

      }

    }

  }

  handleKeyDown = (e) => {

    if (e.keyCode && e.keyCode !== 37 && e.keyCode !== 38 && e.keyCode !== 39 && e.keyCode !== 40) {

      return;

    }

    e.preventDefault();

    e.stopPropagation();

    const { format } = this.props;

    const f = format || 'YYYY-MM-DD';

    const ele = e.target;

    const val = e.target.value;

    if (f === 'YYYY-MM-DD') {

      const parts = val.split('-');

      if (parts.length !== 3) {

        return;

      }

      if (e.keyCode === 37) {

        switch (selectPosition) {

          case 1: break;

          case 2:

            ele.setSelectionRange(0, 4);

            selectPosition -= 1;

            break;

          case 3:

            ele.setSelectionRange(5, 7);

            selectPosition -= 1;

            break;

          default: break;

        }

      } if (e.keyCode === 39) {

        switch (selectPosition) {

          case 3: break;

          case 2:

            ele.setSelectionRange(8, 10);

            selectPosition += 1;

            break;

          case 1:

            ele.setSelectionRange(5, 7);

            selectPosition += 1;

            break;

          default: break;

        }

      } if (e.keyCode === 38) {

        this.handKeyCode(ele, parts, '');

      } if (e.keyCode === 40) {

        this.handKeyCode(ele, parts, 'minus');

      }

    } else {

      const arr = val.split(' ')[0].split('-').concat(val.split(' ')[1].split(':'));

      if (arr.length !== 5) {

        return;

      }

      if (e.keyCode === 37) {

        switch (selectPosition) {

          case 1: break;

          case 2:

            ele.setSelectionRange(0, 4);

            selectPosition -= 1;

            break;

          case 3:

            ele.setSelectionRange(5, 7);

            selectPosition -= 1;

            break;

          case 4:

            ele.setSelectionRange(8, 10);

            selectPosition -= 1;

            break;

          case 5:

            ele.setSelectionRange(11, 13);

            selectPosition -= 1;

            break;

          default: break;

        }

      } if (e.keyCode === 39) {

        switch (selectPosition) {

          case 5: break;

          case 4:

            ele.setSelectionRange(14, 16);

            selectPosition += 1;

            break;

          case 3:

            ele.setSelectionRange(11, 13);

            selectPosition += 1;

            break;

          case 2:

            ele.setSelectionRange(8, 10);

            selectPosition += 1;

            break;

          case 1:

            ele.setSelectionRange(5, 7);

            selectPosition += 1;

            break;

          default: break;

        }

      } if (e.keyCode === 38) {

        this.handKeyCodeMin(ele, arr, '');

      } if (e.keyCode === 40) {

        this.handKeyCodeMin(ele, arr, 'minus');

      }

    }

  }

  handleInputBlur = () => {

    selectPosition = 0;

    const vals = this.state.value;

    const { format, onInputChange } = this.props;

    const { oldValue } = this.state;

    const reg = format === 'YYYY-MM-DD HH:mm' ? /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/ : /^[1-9]\d{3}-\d{2}-\d{2}/;

    if (vals === '') {

      if (typeof onInputChange === 'function') onInputChange('');

      return;

    }

    if (!reg.test(vals)) {

      this.setState({

        value: oldValue,

      });

      if (typeof onInputChange === 'function') onInputChange(oldValue);

      if (!oldValue) {

        Message.error('请按照格式输入时间');

      }

      return;

    }

    const arr = vals.split(' ');

    const sections = arr[0].split('-');

    const times = arr[1] ? arr[1].split(':') : [];

    if (sections[1] * 1 < 1 || sections[1] > 12) {

      sections[1] = '12';

      this.setState({

        value: sections.join('-'),

        oldValue: sections.join('-'),

      });

    }

    if (['01', '03', '05', '07', '08', '10', '12'].some(item => Number(item) === Number(sections[1])) && Number(sections[2]) > 31) {

      sections[2] = 31;

      this.setState({

        value: sections.join('-'),

        oldValue: sections.join('-'),

      });

    }

    if (['04', '06', '09', '11'].some(item => Number(item) === Number(sections[1])) && Number(sections[2]) > 30) {

      sections[2] = 30;

      this.setState({

        value: sections.join('-'),

        oldValue: sections.join('-'),

      });

    } if (Number(sections[1]) === 2 && this.isLeapYear(sections[0]) && sections[2] > 29) {

      sections[2] = 29;

      this.setState({

        value: sections.join('-'),

        oldValue: sections.join('-'),

      });

    } if (Number(sections[1]) === 2 && !this.isLeapYear(sections[0]) && sections[2] > 28) {

      sections[2] = 28;

      this.setState({

        value: sections.join('-'),

        oldValue: sections.join('-'),

      });

    } if (times[0] * 1 < 0 || times[0] * 1 > 23) {

      times[0] = '00';

      this.setState({

        value: `${sections.join('-')} ${times[0]}:${times[1]}`,

        oldValue: `${sections.join('-')} ${times[0]}:${times[1]}`,

      });

    } if (times[1] * 1 < 0 || times[1] * 1 > 60) {

      times[1] = '00';

      this.setState({

        value: `${sections.join('-')} ${times[0]}:${times[1]}`,

        oldValue: `${sections.join('-')} ${times[0]}:${times[1]}`,

      });

    } if (format === 'YYYY-MM-DD HH:mm') {

      this.setState({

        value: `${sections.join('-')} ${times[0]}:${times[1]}`,

        oldValue: `${sections.join('-')} ${times[0]}:${times[1]}`,

      });

    } if (typeof onInputChange === 'function') {

      const v = format === 'YYYY-MM-DD HH:mm' ? `${sections.join('-')} ${times[0]}:${times[1]}` : sections.join('-');

      onInputChange(v);

    }

  }

  handleInputClick = (e) => {

    const { format } = this.props;

    const input = e.target;

    if (e.target.value === '') {

      selectPosition = 0;

      return;

    }

    if (format === 'YYYY-MM-DD HH:mm') {

      if ([0, 1, 2, 3, 4].some(item => item === input.selectionStart)) {

        selectPosition = 1;

        setTimeout(() => {

          input.setSelectionRange(0, 4);

        });

      } if ([5, 6, 7].some(item => item === input.selectionStart)) {

        selectPosition = 2;

        setTimeout(() => {

          input.setSelectionRange(5, 7);

        });

      } if ([8, 9, 10].some(item => item === input.selectionStart)) {

        selectPosition = 3;

        setTimeout(() => {

          input.setSelectionRange(8, 10);

        });

      } if ([11, 12, 13].some(item => item === input.selectionStart)) {

        selectPosition = 4;

        setTimeout(() => {

          input.setSelectionRange(11, 13);

        });

      } if ([14, 15, 16].some(item => item === input.selectionStart)) {

        selectPosition = 5;

        setTimeout(() => {

          input.setSelectionRange(14, 16);

        });

      }

    } else {

      if ([0, 1, 2, 3, 4].some(item => item === input.selectionStart)) {

        selectPosition = 1;

        setTimeout(() => {

          input.setSelectionRange(0, 4);

        });

      } if ([5, 6, 7].some(item => item === input.selectionStart)) {

        selectPosition = 2;

        setTimeout(() => {

          input.setSelectionRange(5, 7);

        });

      } if ([8, 9, 10].some(item => item === input.selectionStart)) {

        selectPosition = 3;

        setTimeout(() => {

          input.setSelectionRange(8, 10);

        });

      }

    }

  }

  // 设置input框的值

  setValue = (v) => {

    this.setState({

      value: v,

    });

  }

  componentWillReceiveProps(nextProps) {

    // console.log('nextProps=====', nextProps);

    if (nextProps.value) {

      const reg = nextProps.format === 'YYYY-MM-DD HH:mm' ? /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/ : /^[1-9]\d{3}-\d{2}-\d{2}/;

      if (!reg.test(nextProps.value) && nextProps.value && /^[1-9]\d{3}-\d{2}-\d{2}/.test(nextProps.value)) {

        this.setState({

          value: `${nextProps.value} 00:00`,

          oldValue: `${nextProps.value} 00:00`,

        });

      } else if (!/^[1-9]\d{3}-\d{2}-\d{2}/.test(nextProps.value) && !reg.test(nextProps.value) && nextProps.value) {

        this.setState({

          value: '',

        });

        MsgBox.error('时间格式有误!');

      } else {

        this.setState({

          value: nextProps.value,

          oldValue: `${nextProps.value}`,

        });

      }

    }

    // 新增判斷,若清空則清空掉值

    if (nextProps.value === undefined || nextProps.value === '' || nextProps.value === null) {

      this.setState({

        value: '',

      });

    }

  }

  handleViewChange = (v) => {

    const { format } = this.props;

    const f = format || 'YYYY-MM-DD';

    // let val = '';

    // if (this.state.value) {

    //   if (f === 'YYYY-MM-DD HH:mm') {

    //     val = /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(this.state.value) ? this.state.value : this.state.oldValue;

    //   } else {

    //     val = /^[1-9]\d{3}-\d{2}-\d{2}/.test(this.state.value) ? this.state.value : this.state.oldValue;

    //   }

    // }

    // console.log(this.state.value);

    // // this.handleInputBlur();

    // if (typeof this.props.onVisibleChange === 'function') {

    //   this.props.onVisibleChange(v, val);

    // }

    this.setState({

      visible: v,

      // value: val,

      // oldValue: val,

    }, () => {

      if (typeof this.props.onVisibleChange === 'function') {

        this.props.onVisibleChange(v, this.state.value);

      }

    });

    if (v) {

      if (f === 'YYYY-MM-DD HH:mm' && this.state.value) {

        setTimeout(() => {

          if (this.myInput) {

            this.myInput.focus();

            this.myInput.getInputNode().setSelectionRange(14, 16);

          }

        }, 500);

        selectPosition = 5;

      } else if (f && this.state.value) {

        setTimeout(() => {

          if (this.myInput) {

            this.myInput.focus();

            this.myInput.getInputNode().setSelectionRange(8, 10);

          }

        }, 500);

        selectPosition = 3;

      }

    } else {

      selectPosition = 0;

    }

  }

  handleDateChange = (v) => {

    v = v ? moment(v).format(this.props.format || 'YYYY-MM-DD') : '';

    this.setState({

      value: v,

      oldValue: v,

    }, () => {

      if (typeof this.props.onChange === 'function') {

        this.props.onChange(v);

      }

      if (typeof this.props.onInputChange === 'function') {

        this.props.onInputChange(v);

      }

    });

  }

  renderInput = () => {

    return (

      <React.Fragment>

        <Input

          placeholder={this.props.placeholder}

          value={this.state.value}

          onChange={(v, e) => this.handleChange(v, e)}

          onKeyDown={(e) => {

            if (e.keyCode === 13) {

              // if (typeof this.props.handleNext === 'function') {

              //   this.props.handleNext(e);

              // }

              const f = this.props.format || 'YYYY-MM-DD';

              let val = e.target.value;

              if (val) {

                if (f === 'YYYY-MM-DD HH:mm') {

                  val = /^[1-9]\d{3}-\d{2}-\d{2}\s\d{2}:\d{2}/.test(val) ? val : this.state.oldValue;

                } else {

                  val = /^[1-9]\d{3}-\d{2}-\d{2}/.test(val) ? val : this.state.oldValue;

                }

              }

              this.setState({

                value: val,

              }, () => {

                this.handleViewChange(false);

                this.handleInputBlur();

              });

            }

            return this.handleKeyDown(e);

          }}

          onBlur={e => this.handleInputBlur(e)}

          onClick={e => this.handleInputClick(e)}

          style={{ position: 'absolute', top: 6, left: 6, width: 'calc(100% - 12px)' }}

          ref={ref => this.myInput = ref}

        />

        {this.props.footerRender && typeof this.props.footerRender === 'function' ? this.props.footerRender() : null}

      </React.Fragment>

    );

  }

  render() {

    return (

      <React.Fragment>

        {

          this.props.onlyInput ?

            <Input

              {...this.props}

              placeholder={this.props.placeholder}

              value={this.state.value}

              onChange={(v, e) => this.handleChange(v, e)}

              onKeyDown={(e) => {

                if (e.keyCode === 13) {

                  if (typeof this.props.handleNext === 'function') {

                    this.props.handleNext(e);

                  }

                  this.setState({

                    visible: false,

                  });

                }

                return this.handleKeyDown(e);

              }}

              onBlur={e => this.handleInputBlur(e)}

              onClick={e => this.handleInputClick(e)}

              ref={ref => this.myInput = ref}

            /> :

            <DatePicker

              {...this.props}

              onVisibleChange={this.handleViewChange}

              footerRender={this.renderInput}

              visible={this.state.visible}

              value={this.state.value}

              onChange={this.handleDateChange}

            />

        }

      </React.Fragment>

    );

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容