index.jsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import react from "react";
  2. import style from "./index.less";
  3. import classNames from 'classnames';
  4. import {deepClone} from '@utils/tools.js';
  5. /**
  6. 单列多选组件下拉 2019-2-20 By_liucf
  7. 接收参数:
  8. show:是否展示下拉
  9. data:下拉数据
  10. handleConfirm: 确定事件
  11. seleData、seleId:选中的数据和id,回读标识选中状态用
  12. **/
  13. class SlideItem extends react.Component{
  14. constructor(props){
  15. super(props);
  16. const seleData = deepClone(props.seleData||[]);
  17. const seleId = deepClone(props.seleId||[]);
  18. this.state={
  19. seleData:seleData||"",
  20. seleId:seleId||[]
  21. }
  22. this.handleSelect = this.handleSelect.bind(this);
  23. this.handleClear = this.handleClear.bind(this);
  24. this.handleClick = this.handleClick.bind(this);
  25. }
  26. getListClass(){
  27. let isHide = this.props.show?'':style['hide'];
  28. return classNames(style['list'],isHide);
  29. }
  30. getSeleStyle(id){
  31. const {seleId} = this.state;
  32. if(seleId.includes(id)){
  33. return style['selected'];
  34. }
  35. return '';
  36. }
  37. handleSelect(e,item){
  38. e&&e.stopPropagation();
  39. let {seleData,seleId} = this.state;
  40. const {name,id} = item;
  41. if(seleId.includes(id)){
  42. seleId.splice(seleId.indexOf(id),1);
  43. seleData = seleData.replace(name,'');
  44. }else{
  45. seleId.push(id);
  46. seleData += name;
  47. }
  48. this.setState({
  49. seleData,
  50. seleId
  51. })
  52. }
  53. handleClear(e){
  54. e&&e.stopPropagation();
  55. this.setState({
  56. seleData:"",
  57. seleId:[]
  58. })
  59. }
  60. getStyle(){
  61. const {show} = this.props;
  62. return {
  63. display:show?'table':'none'
  64. }
  65. }
  66. handleClick(e){//确定
  67. e&&e.stopPropagation();
  68. const {handleConfirm} = this.props;
  69. const params = this.state;
  70. handleConfirm&&handleConfirm(params);
  71. }
  72. render(){
  73. const {data} = this.props;
  74. return <div className={this.getListClass()} style={this.getStyle()} contentEditable="false">
  75. <ul>
  76. {data&&data.map((it)=>{
  77. return <li onClick={(e)=>this.handleSelect(e,it)} className={this.getSeleStyle(it.id)} title={it.name.length>8?it.name:''}>{it.name&&it.name.length>8?it.name.slice(0,8)+'...':it.name}</li>
  78. })}
  79. <li onClick={this.handleClear} className={style['mClear']}>清空选项</li>
  80. <li onClick={this.handleClick} className={style['mConfirm']}>确定</li>
  81. </ul>
  82. </div>
  83. }
  84. }
  85. export default SlideItem;