index.jsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React,{Component} from 'react';
  2. import style from './index.less';
  3. import ReactDom from "react-dom";
  4. class NumberPan extends Component{
  5. constructor(props){
  6. super(props);
  7. this.state = {
  8. value:''
  9. }
  10. }
  11. handleSelect(e){
  12. e.stopPropagation();
  13. const text = e.target.innerText;
  14. const value = this.props.toClear?'':this.state.value; //键盘输入替换已有的值
  15. const onSelect = this.props.handleSelect;
  16. this.setState({
  17. value: value+text
  18. });
  19. onSelect&&onSelect(value+text);
  20. }
  21. handleClear(e){
  22. e.stopPropagation();
  23. const onSelect = this.props.handleSelect;
  24. this.setState({
  25. value: ''
  26. });
  27. onSelect&&onSelect('');
  28. }
  29. handleClose(e){
  30. e.stopPropagation();
  31. //关闭弹窗
  32. const {onClose} = this.props;
  33. onClose&&onClose();
  34. }
  35. handleBack(e){
  36. e.stopPropagation();
  37. const value = this.state.value;
  38. const len = value.length-1;
  39. if(len<0){
  40. return;
  41. }
  42. const onSelect = this.props.handleSelect;
  43. const text = value.substring(0,len);
  44. this.setState({
  45. value:text
  46. });
  47. onSelect&&onSelect(text);
  48. }
  49. getStyle(){
  50. const {left,top,show} = this.props;
  51. return {
  52. left:left?left+'px':'0',
  53. top:top?top+'px':'0',
  54. display:show?'table':'none' //table onBlur阻止冒泡是为了修复multSpread中数字键盘点击触发最外层数字组件onBlur事件
  55. }
  56. }
  57. render(){
  58. const select = this.handleSelect.bind(this);
  59. const domNode = document.getElementById('root');
  60. return ReactDom.createPortal(
  61. <div className={style['panBox']}
  62. style={this.getStyle()}
  63. onBlur={(e)=>e.stopPropagation()}
  64. onDoubleClick={(e)=>e.stopPropagation()}>
  65. <table className={style['pan']} >
  66. <tr>
  67. <td><button onClick={select}>1</button></td>
  68. <td><button onClick={select}>2</button></td>
  69. <td><button onClick={select}>3</button></td>
  70. <td><button onClick={select}>/</button></td>
  71. </tr>
  72. <tr>
  73. <td><button onClick={select}>4</button></td>
  74. <td><button onClick={select}>5</button></td>
  75. <td><button onClick={select}>6</button></td>
  76. <td><button onClick={this.handleBack.bind(this)}>回退</button></td>
  77. </tr>
  78. <tr>
  79. <td><button onClick={select}>7</button></td>
  80. <td><button onClick={select}>8</button></td>
  81. <td><button onClick={select}>9</button></td>
  82. <td><button onClick={this.handleClear.bind(this)}>清空</button></td>
  83. </tr>
  84. <tr>
  85. <td><button onClick={select}>.</button></td>
  86. <td><button onClick={select}>0</button></td>
  87. <td><button onClick={select}>~</button></td>
  88. <td><button onClick={this.handleClose.bind(this)}>确定</button></td>
  89. </tr>
  90. </table>
  91. </div>
  92. ,domNode)
  93. }
  94. }
  95. export default NumberPan;