index.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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} <span class={styles.unitScore}>({props.score || 0}分)</span>
  57. <Tag
  58. type="primary"
  59. style={{
  60. lineHeight: '20px'
  61. }}
  62. >
  63. {answerTypeName.value}
  64. </Tag>
  65. </div>
  66. {props.showRate && (
  67. <div class={styles.unitTitleRate}>
  68. <Icon name={iconPassCheck} class={styles.icon} />
  69. 正确率:
  70. <span class={styles.rate}>{props.extra.rightRate || 0}%</span>
  71. </div>
  72. )}
  73. {props.extra.questionDetail || mediaUrls.value ? (
  74. <div class={styles.unitDetail}>
  75. <div v-html={props.extra.questionDetail}></div>
  76. {mediaUrls.value &&
  77. mediaUrls.value.map(
  78. (url: any) =>
  79. url && (
  80. <>
  81. {url.substr(-3) === 'mp3' ? (
  82. <UnitAudio src={url} class={styles.valueAudio} />
  83. ) : (
  84. <Image class={[styles.unitTitleImg, 'answerTitleImg']} src={url} />
  85. )}
  86. </>
  87. )
  88. )}
  89. </div>
  90. ) : (
  91. ''
  92. )}
  93. </>
  94. )
  95. }
  96. })