index.jsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import React,{Component} from 'react';
  2. import classNames from 'classnames';
  3. import $ from 'jquery';
  4. import style from "./index.less";
  5. import {storageLocal} from "@utils/tools.js";
  6. /**
  7. * author: Liucf
  8. * 主诉常见症状下拉--修改为横铺多选(3.13)
  9. * 接收参数:
  10. * data: json数组,数据源;
  11. * show: true/false,与私有属性hide共同控制组件的显示隐藏;
  12. * onSelect: 确定事件;
  13. *
  14. * **/
  15. class CommonSymptom extends Component{
  16. constructor(props){
  17. super(props);
  18. this.state={
  19. select:[],
  20. ids:[],
  21. hide:false,
  22. conceptId:[]
  23. }
  24. this.div = React.createRef();
  25. this.handleSelect = this.handleSelect.bind(this);
  26. this.handleClear = this.handleClear.bind(this);
  27. this.handleConfirm = this.handleConfirm.bind(this);
  28. this.handleOuter = this.handleOuter.bind(this);
  29. }
  30. getClass(){
  31. let isHide = this.props.show?'':style['hide'];
  32. return classNames(style['list'],isHide);
  33. }
  34. handleSelect(e,item){
  35. // e.stopPropagation();
  36. let {select,ids,conceptId} = this.state;
  37. const id = item.questionId||item.id; //缓存localStorage中的数据有id
  38. const copid = item.conceptId
  39. if(conceptId.includes(copid)){
  40. conceptId.splice(conceptId.indexOf(copid),1);
  41. if(ids.includes(id)){
  42. ids.splice(ids.indexOf(id),1);
  43. }
  44. let selectData = select;
  45. select.forEach((it,i)=>{
  46. if(it.conceptId==copid){
  47. selectData.splice(i,1);
  48. }
  49. })
  50. select = selectData;
  51. }else{
  52. // ids.push(id); //questionId可能没有
  53. if(id){
  54. ids.push(id);
  55. }
  56. conceptId.push(copid);
  57. select.push(item);
  58. }
  59. this.setState({
  60. select,
  61. ids,
  62. conceptId
  63. })
  64. }
  65. getStyle(id){
  66. const {conceptId} = this.state;
  67. if(conceptId.includes(id)){
  68. return style['selected'];
  69. }
  70. return '';
  71. }
  72. handleClear(e){
  73. // e.stopPropagation();
  74. this.setState({
  75. select:[],
  76. ids:[],
  77. conceptId:[]
  78. })
  79. }
  80. handleConfirm(e){
  81. // e.stopPropagation();
  82. const {onSelect} = this.props;
  83. const {select,ids,conceptId} = this.state;
  84. onSelect&&onSelect({select,ids,conceptId});
  85. }
  86. handleOuter(e){
  87. e.stopPropagation();
  88. let itemBox = $('#mainSuit')[0]; //主诉框
  89. if(this.div.current.contains(e.target) || e.target == itemBox){
  90. this.setState({
  91. hide:false
  92. })
  93. }else{
  94. this.setState({
  95. hide:true,
  96. select:[],
  97. ids:[],
  98. conceptId:[]
  99. })
  100. }
  101. }
  102. componentDidMount() {
  103. window.addEventListener('click', this.handleOuter);
  104. }
  105. componentWillUnmount() {
  106. window.removeEventListener('click', this.handleOuter);
  107. }
  108. render(){
  109. const {data} = this.props;
  110. const {hide} = this.state;
  111. const mainSymp = storageLocal.get('mainSymp');
  112. const mainHis = mainSymp?JSON.parse(mainSymp).reverse():[];
  113. return <div className={this.getClass()} contenteditable="false" style={{'display':hide?'none':'block'}} ref={this.div} onClick={this.handleOuter}>
  114. <ul className={style["listBox"]}>
  115. {mainHis.length>0?<ul className={style["his"]}>
  116. <p>最近输入症状:</p>
  117. {mainHis.map((it)=>{
  118. return <li onClick={(e)=>this.handleSelect(e,it)} className={this.getStyle(it.conceptId)} title={it.name.length>5?it.name:''}>{it.name.length>5?it.name.slice(0,4)+'...':it.name}</li>
  119. })}
  120. </ul>:''}
  121. <p className={style['c-title']}>常见症状:</p>
  122. {data&&data.map((it)=>{
  123. return <li onClick={(e)=>this.handleSelect(e,it)} className={this.getStyle(it.conceptId)} title={it.name.length>5?it.name:''}>{it.name.length>5?it.name.slice(0,4)+'...':it.name}</li>
  124. })}
  125. </ul>
  126. <div className={style['oper']}>
  127. <span className={style['clear']} onClick={this.handleClear}>清空选项</span>
  128. <span className={style['confirm']} onClick={this.handleConfirm}>确定</span>
  129. </div>
  130. </div>
  131. }
  132. }
  133. export default CommonSymptom;