index.jsx 4.2 KB

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