index.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { Tag, Image, Icon } from 'vant';
  2. import { computed, defineComponent } from 'vue';
  3. import { QuestionType, QuestionTypeName } from '../../unit';
  4. import styles from './index.module.less';
  5. import iconPassCheck from '../../images/icon-pass-check.png';
  6. import UnitAudio from '../unit-audio';
  7. export default defineComponent({
  8. name: 'answer-title',
  9. props: {
  10. index: {
  11. type: Number,
  12. default: 1
  13. },
  14. name: {
  15. // 题目名称
  16. type: String,
  17. default: ''
  18. },
  19. score: {
  20. type: Number,
  21. default: 0
  22. },
  23. answerType: {
  24. // 类型
  25. type: String,
  26. default: ''
  27. },
  28. extra: {
  29. type: Object,
  30. default: () => ({})
  31. },
  32. showRate: {
  33. type: Boolean,
  34. default: false
  35. }
  36. },
  37. setup(props) {
  38. const answerTypeName = computed(() => {
  39. if (props.answerType === QuestionType.CHECKBOX) {
  40. return QuestionTypeName.CHECKBOX;
  41. } else if (props.answerType === QuestionType.LINK) {
  42. return QuestionTypeName.LINK;
  43. } else if (props.answerType === QuestionType.SORT) {
  44. return QuestionTypeName.SORT;
  45. } else if (props.answerType === QuestionType.PLAY) {
  46. return QuestionTypeName.PLAY;
  47. }
  48. return QuestionTypeName.RADIO;
  49. });
  50. const mediaUrls = computed(() =>
  51. props.extra.mediaUrls ? props.extra.mediaUrls.split(',') : ''
  52. );
  53. return () => (
  54. <>
  55. <div class={styles.unitSubjectTitle}>
  56. {props.index}、{props.name}
  57. {/* <span class={styles.unitScore}>({props.score || 0}分)</span> */}
  58. <Tag
  59. type="primary"
  60. style={{
  61. marginLeft: '8px',
  62. lineHeight: '20px'
  63. }}>
  64. {answerTypeName.value}
  65. </Tag>
  66. </div>
  67. {props.showRate && (
  68. <div class={styles.unitTitleRate}>
  69. <Icon name={iconPassCheck} class={styles.icon} />
  70. 正确率:
  71. <span class={styles.rate}>{props.extra.rightRate || 0}%</span>
  72. </div>
  73. )}
  74. {props.extra.questionDetail || mediaUrls.value ? (
  75. <div class={styles.unitDetail}>
  76. <div v-html={props.extra.questionDetail}></div>
  77. {mediaUrls.value &&
  78. mediaUrls.value.map(
  79. (url: any) =>
  80. url && (
  81. <>
  82. {url.substr(-3) === 'mp3' ? (
  83. <UnitAudio src={url} class={styles.valueAudio} />
  84. ) : (
  85. <Image
  86. class={[styles.unitTitleImg, 'answerTitleImg']}
  87. src={url}
  88. />
  89. )}
  90. </>
  91. )
  92. )}
  93. </div>
  94. ) : (
  95. ''
  96. )}
  97. </>
  98. );
  99. }
  100. });