index.jsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { Component } from "react";
  2. import style from "./index.less";
  3. import config from '@config/index';
  4. import $ from 'jquery';
  5. class Textarea extends Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = {
  9. timer:null,
  10. val:'报告描述或意见'
  11. };
  12. this.textInput = React.createRef();
  13. this.$dom = React.createRef();
  14. this.$domW = React.createRef();
  15. this.handleInput = this.handleInput.bind(this);
  16. this.handleFocus = this.handleFocus.bind(this);
  17. }
  18. handleInput(e){
  19. const {handleChangeAssistValue,idx,handlePush} = this.props;
  20. const text = (e.target.innerHTML || e.target.innerText);
  21. $(e.target).find('img').remove()
  22. // e.target.innerHTML = e.target.textContent
  23. const stimer = this.state.timer;
  24. handleChangeAssistValue&&handleChangeAssistValue(text,idx);
  25. //右侧推送--延时推送
  26. clearTimeout(stimer);
  27. let timer = setTimeout(function(){
  28. handlePush&&handlePush();
  29. clearTimeout(stimer);
  30. },config.delayPushTime);
  31. if(text.trim() != '' && text != '<br>'){
  32. e.target.nextSibling.innerText?(e.target.nextSibling.innerText = ''):(e.target.nextSibling.innerHTML = '')
  33. }else{
  34. e.target.nextSibling.innerText?(e.target.nextSibling.innerText = '报告描述或意见'):(e.target.nextSibling.innerHTML = '报告描述或意见')
  35. }
  36. this.setState({
  37. timer
  38. });
  39. }
  40. shouldComponentUpdate(next){
  41. if(JSON.stringify(next) == JSON.stringify(this.props)){
  42. return false;
  43. }
  44. return true;
  45. }
  46. componentWillReceiveProps(next){
  47. const isRead = this.props.isRead;
  48. if(next.isRead != isRead){
  49. this.$dom.current.innerText?(this.$dom.current.innerText = next.value||'') : (this.$dom.current.innerHTML = next.value||'')
  50. if(next.value && next.value.trim()){
  51. this.$dom.current.nextSibling.innerText = ''
  52. }else{
  53. this.$dom.current.nextSibling.innerHTML = '报告描述或意见'
  54. }
  55. }
  56. }
  57. componentDidMount(){
  58. const {value} = this.props;
  59. if(value && value.trim()){
  60. this.$dom.current.innerText?(this.$dom.current.innerText = value) : (this.$dom.current.innerHTML = value)
  61. this.$dom.current.nextSibling.innerText?(this.$dom.current.nextSibling.innerText = ''):(this.$dom.current.nextSibling.innerHTML = '')
  62. }else{
  63. this.$dom.current.nextSibling.innerText?(this.$dom.current.nextSibling.innerText = '报告描述或意见'):(this.$dom.current.nextSibling.innerHTML = '报告描述或意见')
  64. }
  65. }
  66. handleFocus(){ //ie8下提示语挡住输入框,导致输入框无法聚焦
  67. this.textInput.current.previousSibling.focus();
  68. }
  69. render() {
  70. const {idx,disabled} = this.props;
  71. return (
  72. <div className={style.textWap}>
  73. <div className={style.divTextarea}
  74. contenteditable={disabled?false:true}
  75. ref={this.$dom}
  76. onInput={this.handleInput}
  77. onKeyUp={this.handleInput}
  78. ></div>
  79. <p ref={this.textInput} onClick={this.handleFocus} className={style.textareaWarring}></p>
  80. </div>
  81. );
  82. }
  83. }
  84. export default Textarea;