index.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import React,{Component} from 'react';
  2. import style from './index.less';
  3. import config from '@config/index.js';
  4. import Notify from '../Notify/index.js';
  5. import ReactDom from "react-dom";
  6. class NumberUnitPan extends Component{
  7. constructor(props){
  8. super(props);
  9. this.state = {
  10. value:''
  11. }
  12. this.handleSelect = this.handleSelect.bind(this);
  13. }
  14. handleSelect(e){
  15. e.stopPropagation();
  16. const text = e.target.innerText;
  17. const preValue = this.state.value;
  18. if(+text==0 && !preValue){//第一位不能是0
  19. Notify.info("请输入正确时间");
  20. return false;
  21. }
  22. const value = this.props.toClear?'':this.state.value; //键盘输入替换已有的值
  23. const onSelect = this.props.handleSelect;
  24. this.setState({
  25. value: value+text
  26. });
  27. onSelect&&onSelect(value+text);
  28. }
  29. handleClear(e){
  30. e.stopPropagation();
  31. const onSelect = this.props.handleSelect;
  32. this.setState({
  33. value: ''
  34. });
  35. onSelect&&onSelect('');
  36. }
  37. handleClose(e){
  38. e.stopPropagation();
  39. //关闭弹窗
  40. const {onClose} = this.props;
  41. onClose&&onClose();
  42. }
  43. handleBack(e){
  44. e.stopPropagation();
  45. // const value = this.state.value;
  46. const value = this.props.value;
  47. const len = value.length-1;
  48. if(len<0){
  49. return;
  50. }
  51. const onSelect = this.props.handleSelect;
  52. const text = value.substring(0,len);
  53. this.setState({
  54. value:text
  55. });
  56. onSelect&&onSelect(text);
  57. }
  58. getStyle(){
  59. const {left,top,show} = this.props;
  60. return {
  61. left:left?left+'px':'0',
  62. top:top?top+'px':'0',
  63. display:show?'table':'none' //table onBlur阻止冒泡是为了修复multSpread中数字键盘点击触发最外层数字组件onBlur事件
  64. }
  65. }
  66. componentWillReceiveProps(nextProps){
  67. //重新选择的值替换 不追加
  68. if(!nextProps.show){
  69. this.setState({
  70. value:''
  71. });
  72. }
  73. }
  74. render(){
  75. // const select = this.handleSelect.bind(this);
  76. const domNode = document.getElementById('root');
  77. return ReactDom.createPortal(
  78. <div className={style['panBox']} onBlur={(e)=>e.stopPropagation()} style={this.getStyle()}>
  79. <table className={style['pan']} >
  80. <tr>
  81. <td><span onClick={this.handleSelect}>1</span></td>
  82. <td><span onClick={this.handleSelect}>2</span></td>
  83. <td><span onClick={this.handleSelect}>3</span></td>
  84. <td><span onClick={this.handleSelect}>/</span></td>
  85. </tr>
  86. <tr>
  87. <td><span onClick={this.handleSelect}>4</span></td>
  88. <td><span onClick={this.handleSelect}>5</span></td>
  89. <td><span onClick={this.handleSelect}>6</span></td>
  90. <td><span onClick={this.handleBack.bind(this)}>回退</span></td>
  91. </tr>
  92. <tr>
  93. <td><span onClick={this.handleSelect}>7</span></td>
  94. <td><span onClick={this.handleSelect}>8</span></td>
  95. <td><span onClick={this.handleSelect}>9</span></td>
  96. <td><span onClick={this.handleClear.bind(this)}>清空</span></td>
  97. </tr>
  98. <tr>
  99. <td><span onClick={this.handleSelect}>.</span></td>
  100. <td><span onClick={this.handleSelect}>0</span></td>
  101. <td><span onClick={this.handleSelect}>~</span></td>
  102. <td><span onClick={this.handleClose.bind(this)}>确定</span></td>
  103. </tr>
  104. <tr>
  105. <td><span onClick={this.handleSelect}>{config.timeUnit.minute}</span></td>
  106. <td><span onClick={this.handleSelect}>{config.timeUnit.hour}</span></td>
  107. <td><span onClick={this.handleSelect}>{config.timeUnit.day}</span></td>
  108. <td><span onClick={this.handleSelect}>{config.timeUnit.age}</span></td>
  109. </tr>
  110. <tr>
  111. <td><span onClick={this.handleSelect}>{config.timeUnit.week}</span></td>
  112. <td><span onClick={this.handleSelect}>{config.timeUnit.month}</span></td>
  113. <td><span onClick={this.handleSelect}>{config.timeUnit.year}</span></td>
  114. </tr>
  115. </table>
  116. </div>
  117. ,domNode)
  118. }
  119. }
  120. export default NumberUnitPan;