index.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React, { Component } from 'react';
  2. import './index.less';
  3. import Assets from '@src/components/Assets';
  4. function getKey(type, index, selected, answer) {
  5. return `${(selected[type] || [])[index] ? 'selected' : ''} ${(answer[type] || [])[index] ? 'true' : 'false'}`;
  6. }
  7. export default class AnswerSelect extends Component {
  8. constructor(props) {
  9. super(props);
  10. const select = [];
  11. for (let i = 0; i < props.list.length; i += 1) {
  12. select[i] = false;
  13. }
  14. let index = -1;
  15. const { selected = {}, answer = {}, type } = props;
  16. let result = true;
  17. (selected[type] || []).forEach((row, i) => {
  18. if (row) index = i;
  19. if (row !== answer[type][i]) result = false;
  20. });
  21. this.state = { selecting: false, select, index, result };
  22. }
  23. onChange(index) {
  24. const { onChange } = this.props;
  25. const { select } = this.state;
  26. for (let i = 0; i < select.length; i += 1) {
  27. select[i] = false;
  28. }
  29. select[index] = true;
  30. if (onChange) onChange(select);
  31. this.close();
  32. this.setState({ index });
  33. }
  34. open() {
  35. this.setState({ selecting: true });
  36. }
  37. close() {
  38. this.setState({ selecting: false });
  39. }
  40. render() {
  41. const { selecting, index, result } = this.state;
  42. const { list = [], show, selected = {}, answer = {}, type, fix } = this.props;
  43. const title = list.length > 0 && index >= 0 ? list[index] : ' ';
  44. return (
  45. <div className="answer-select">
  46. <div hidden={!selecting} className="mask" onClick={() => this.close()} />
  47. <div className={`select-warp ${show ? (result ? 'true' : 'false') : ''}`}>
  48. <div className="text" onClick={() => this.open()}>
  49. {` ${title}`}
  50. <Assets name="chooser_icon" />
  51. </div>
  52. <div className={`select-body ${selecting ? 'select' : ''}`}>
  53. {list.map((item, i) => {
  54. return (
  55. <div className={`item ${getKey(type, i, selected, answer)} ${show ? 'show' : ''}`} onClick={() => !fix && this.onChange(i)}>
  56. <div className="icon" />{item}
  57. </div>
  58. );
  59. })}
  60. </div>
  61. </div>
  62. </div>
  63. );
  64. }
  65. }