当前位置:   article > 正文

考试系统—vue遍历试题,答题答案存储_vue实现考试题目功能

vue实现考试题目功能

实现功能:考试试卷的试题从数据库读取为数组形式,前端遍历后,用户开始答题后,对用户的答案进行存储。

一、遍历试题

  1. <div v-for="(item,index) in tableData.ITEM_DATA"
  2. style="width: 90%;margin:10px auto;padding: 20px;"
  3. class="listPage">
  4. <!-- 这里做了和答题卡的联动,可看其他文章有写-->
  5. <span :class="`classabc${index+1}`">{{ index + 1 }}</span>
  6. <!-- 这里写题干-->
  7. <div style="margin: 20px">
  8. <el-row>
  9. <!-- 这里写选项的遍历-->
  10. </el-row>
  11. </div>
  12. </div>

数据的格式如下:

  1. tableData: {
  2. "id": "1",
  3. "totalQuestionNum": "100",
  4. "duration": 30,
  5. "handTime": "30",
  6. "name": "李XXX",
  7. "companyName": "XXXXX",
  8. "ITEM_DATA": [
  9. {
  10. "id": "1",
  11. "type": "1",
  12. "content": "单选题题干内容",
  13. "level": 3,
  14. "analysis": "题目解析1",
  15. "OPTION_DATA": [
  16. {
  17. "id": "1",
  18. "content": "单选题选项内容1",
  19. },
  20. {
  21. "id": "2",
  22. "content": "单选题选项内容2",
  23. },
  24. {
  25. "id": "3",
  26. "content": "单选题选项内容3",
  27. },
  28. {
  29. "id": "4",
  30. "content": "单选题选项内容4",
  31. }
  32. ]
  33. },
  34. {
  35. "id": "2",
  36. "type": "2",
  37. "content": "多选题题干内容",
  38. "level": 4,
  39. "analysis": "题目解析2",
  40. "OPTION_DATA": [
  41. {
  42. "id": "1",
  43. "content": "多选题选项内容1",
  44. },
  45. {
  46. "id": "2",
  47. "content": "多选题选项内容2",
  48. },
  49. {
  50. "id": "3",
  51. "content": "多选题选项内容3",
  52. },
  53. {
  54. "id": "4",
  55. "content": "多选题选项内容4",
  56. },
  57. {
  58. "id": "5",
  59. "content": "多选题选项内容5",
  60. }
  61. ]
  62. }
  63. ]

把题干补充上(写在题干位置):

  1. <span>{{ item.type == 1 ? "(单选题)" : item.type == 2 ? "(多选题)" : "(判断题)" }}
  2. {{item.content}}
  3. </span>

二、遍历选项

以下代码写在<el-row></el-row>中

  1. <el-radio-group v-if="item.type == 1">
  2. <el-col style="margin-top: 10px" v-for="(option1,i) in item.OPTION_DATA" :key="i">
  3. <el-radio :label="i">{{ i + 1 }}.{{ option1.content }}</el-radio>
  4. </el-col>
  5. </el-radio-group>
  6. <el-checkbox-group v-if="item.type == 2">
  7. <el-col style="margin-top: 10px" v-for="(option2,j) in item.OPTION_DATA" :key="j">
  8. <el-checkbox :label="j">{{ j + 1 }}.{{ option2.content }}</el-checkbox>
  9. </el-col>
  10. </el-checkbox-group>
  11. <el-radio-group v-if="item.type == 3" >
  12. <el-col style="margin-top: 10px">
  13. <el-radio :label="0">对</el-radio>
  14. <el-radio :label="1">错</el-radio>
  15. </el-col>
  16. </el-radio-group>

v-if用来区别单选、多选和判断;

三、定义新数组来绑定已作答试题的答案

定义一个新数组:

  1. selectedOptions: [
  2. {
  3. id: '',
  4. selectedOptionId: '',
  5. <!-- 多选题需要绑定选项数组,单独再加一个选项数组给多选使用 -->
  6. selectedOptionIds:[
  7. {
  8. selectedOptionId:''
  9. }
  10. ]
  11. }
  12. ]

由于试卷试题数量不固定,所以我们写一个钩子函数来获取试题数量:

  1. created() {
  2. this.loadSelectedOptions()
  3. },
  4. methods:{
  5. //加载用户答题后的数组
  6. loadSelectedOptions() {
  7. let _this = this
  8. let i = 0
  9. _this.tableData.ITEM_DATA.forEach(function (value, index, array) {
  10. i = index
  11. })
  12. for (let j = 0; j < i; j++) {
  13. _this.selectedOptions.push(
  14. {
  15. id: "",
  16. selectedOptionId: "",
  17. selectedOptionIds: []
  18. }
  19. )
  20. }
  21. }
  22. }

这样答案数组的长度就和试题数量一致了,下一步把答案数组selectedOptions和试题的单选多选框绑定上:

  1. <el-radio-group v-if="item.type == 1" v-model="selectedOptions[index].selectedOptionId">
  2. <el-col style="margin-top: 10px" v-for="(option1,i) in item.OPTION_DATA" :key="i">
  3. <el-radio :label="i">{{ i + 1 }}.{{ option1.content }}</el-radio>
  4. </el-col>
  5. </el-radio-group>
  6. <el-checkbox-group v-if="item.type == 2" v-model="selectedOptions[index].selectedOptionIds">
  7. <el-col style="margin-top: 10px" v-for="(option2,j) in item.OPTION_DATA" :key="j">
  8. <el-checkbox :label="j">{{ j + 1 }}.{{ option2.content }}</el-checkbox>
  9. </el-col>
  10. </el-checkbox-group>
  11. <el-radio-group v-if="item.type == 3" v-model="selectedOptions[index].selectedOptionId">
  12. <el-col style="margin-top: 10px">
  13. <el-radio :label="0">对</el-radio>
  14. <el-radio :label="1">错</el-radio>
  15. </el-col>
  16. </el-radio-group>

这样用户答题后的选择就会存储在新的数组内,完成!附图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/878053
推荐阅读
相关标签
  

闽ICP备14008679号