Vue3:一页多题答案提示及循环radio和checkbox混合使用

news2024/11/26 17:22:52

一页多题,类型包括单选(单选、判断)和多选,radio和checkbox混合使用,答案检验数据匹配,正确答案格式化,答案提交数据格式化,数据提交。

效果:

数据获取:

数据提交:

HTML:

<template>

<!--其他HTML结构-->

<ul class="question f16">
  <li v-for="(list,index) in questionData" :key="index">
    <h5>{{list.type}}题</h5>
    <h6 v-if="isScoreTxt">
      <b :class="{daanErr:list.scoreTxt !='正确'}" v-if="list.scoreTxt !='正确'">正确选项是:{{list.scoreTxt}}</b>
      <b v-else>{{list.scoreTxt}}</b>
    </h6>
    
    <!--单选及判断-->
    <dl v-if="list.type != '多选'">
      <dt v-html="list.title"></dt>
      <dd>
        <label v-for="(radio,id) in list.xuanxiang" :key="id">
          <input type="radio" :name="list.id" :value="list.id+'_'+radio.name" v-model="radioData[list.id]">
          <span><b>{{radio.name}}</b>{{radio.content}}</span>
        </label>
      </dd>
    </dl>

    <!--多选-->
    <dl v-else>
      <dt v-html="list.title"></dt>
      <dd>
        <label v-for="(checkbox,checkboxIndex) in list.xuanxiang" :key="checkboxIndex">
          <input type="checkbox" :value="list.id+'_'+checkbox.name" v-model="checkData">
          <span><b>{{checkbox.name}}</b>{{checkbox.content}}</span>
      </label>
    </dd>
    </dl>
  </li>
</ul>
<div class="checkEnterBt f18 sysmt40">
  <button @click="checkEnter">提交答案</button>
  <button @click="checkChange">换题再测试</button>
</div>

<!--其他HTML结构-->

</template>

JS:

<script setup>
import { defineComponent, getCurrentInstance, ref, reactive, computed, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onErrorCaptured, onRenderTracked, onRenderTriggered, onActivated, onDeactivated, onServerPrefetch, watch,toRaw } from 'vue';
import {useRoute, onBeforeRouteUpdate} from 'vue-router'
import { useStore } from 'vuex';

//vantUl的showToast请提示
import { showToast } from 'vant';

//使用vue的getCurrentInstance 方法获取当前组件实例
const { proxy } = getCurrentInstance()

//获取vuex数据
let store = useStore();

//使用router
const route = useRoute()


//获取题目列表数据
let questionData = ref([]) //答题数据
let answerData = ref([]) //格式化后答案
const getQuestion = () => {

    /*axois获取题目数据*/

    console.log(response.data.data.data)

    questionData.value = response.data.data.data

    //格式化数据答案为[id,选项],单选[id,A],多选[id,A],[id,C]
    for(let i=0;i<response.data.data.data.length;i++){
      for(let n=0;n<response.data.data.data[i].daan.length;n++){
        if(response.data.data.data[i].daan[n] != "_"){
          answerData.value.push([response.data.data.data[i].id,response.data.data.data[i].daan[n]])
        }
      }
    }

  /*其他代码*/

}


//答案选择
let radioData= ref([]) //单选
let checkData = ref([]) //多选
let selectData = ref([]) //单选和多选合集
let isScoreTxt = ref(false) //答案是否显示校正 防多次点击


const checkEnter = ()=>{
  if(!isScoreTxt.value){
    let newSelect = [] //单选+多选
    newSelect = Object.values({...checkData.value,...radioData.value})
    //console.log(newSelect)
    for(let y=0;y<newSelect.length;y++){
      selectData.value.push(newSelect[y].split("_"))
    }
    //console.log(selectData.value)
    for(let s=0;s<selectData.value.length;s++){
      let selectID =  selectData.value[s][0] //用户答题id
      let selectTxt = '' //用户选择答案
      let daanTxt = '' //正确答案
      let enterTxt = '' //按后端要求格式化用户每次选择答案
      let find=0 //查找次数
      for(let i=0;i<selectData.value.length;i++){
        if(selectData.value[i][0] == selectID){
          selectTxt += selectData.value[i][1]
          enterTxt += selectData.value[i][1]+'_'
        }
      }
      for(let a=0;a<answerData.value.length;a++){
        if(answerData.value[a][0] == selectID){
          daanTxt += answerData.value[a][1]
        }
      }
      for(let x=0;x<scoreEnter.length;x++){
        if(selectID == scoreEnter[x][0]){
          find=1
        }
      }
      if(find ==0){
        let enter = [selectID,'-'+enterTxt]
        scoreEnter.push(enter)
        let index = '' //查找对应id的下标
        for(let q=0;q<questionData.value.length;q++){
          index = questionData.value.findIndex(item => item.id == selectID)
        }
        if(selectTxt.split("").sort().join("") == daanTxt.split("").sort().join("")){
          questionData.value[index].scoreTxt="正确"
        }else{
          questionData.value[index].scoreTxt=daanTxt
        }
      }
    }
    if(scoreEnter.length == questionData.value.length){
      isScoreTxt.value = true
      let enterData = []
      for(let u=0;u<scoreEnter.length;u++){
        enterData.push(scoreEnter[u].join("").slice(0,-1))
      }
      let params = {
       /*其他参数 category_id:proxy.$route.params.category_id,*/
        ti_str:enterData.toString(),
      }

      /*数据提交*/

        if(response.data.status == 1){
          showToast("答题提交成功!");
        }

      /*数据提交*/

    }else{
      showToast("回答完全部问题再提交答案哦!");
    }
  }else{
    showToast("校正及正确选项已显示,请换题再测!");
  }
}

//换题再测试
const checkChange = ()=>{
  questionData.value = undefined
  answerData.value = []
  radioData.value = []
  checkData.value = []
  selectData.value = []
  scoreEnter=[]
  getQuestion()

}


onBeforeMount(() => {
  getQuestion()

})

</script>

CSS:

.question li{background:#fff;padding:30px 20px 20px 20px;border-radius:10px;box-shadow:0 0 7px #ccc;border:1px solid #eaeaea;margin-bottom:40px;position:relative;}
.question li h6{position:absolute;right:20px;top:30px;}
.question li h6 b.daanErr{color:#e60000;}
.question li h6 b{color:#018407;}
.question li h5{border-left:4px solid #ff6e52;font-size:20px;font-weight:bold;padding-left:15px;margin-bottom:20px;}
.question li dt{padding:0 0 20px 20px;}
.question li dd{padding-right:50px;}
.question li label{display:line-block;position:relative;margin:0 20px 20px 0;padding-left:20px;}
.question li label span{border:1px solid #d0d0d0;border-radius:10px;padding:7px 20px;box-sizing:border-box;display:inline-block;line-height:26px;}
.question li label input{display:none;}
.question li label input:checked+span{background:#fffafa;z-index:2;color:#b80000;border:1px solid #b80000;border-radius:10px;}
.question li label span b{display:inline-block;font-weight:normal;margin-right:5px;}


.checkEnterBt{display:flex;justify-content:space-around;align-items:center;}
.checkEnterBt button{width:40%;background:#e60000;color:#fff;border:none;padding:20px 0;border-radius:10px;}
.checkEnterBt button:nth-child(2){background:#007ce6;}

解释:

数据里的答案为:A_B_C_D

需要校正展示的答案为:ABCD

提交数据的答案为:题目id-A_B_C_D

通过 :value="list.id+'_'+radio.name"  和  :value="list.id+'_'+checkbox.name" 将选中数据统一为题目id_选项

<input type="radio" :name="list.id" :value="list.id+'_'+radio.name" v-model="radioData[list.id]">


<input type="checkbox" :value="list.id+'_'+checkbox.name" v-model="checkData">

展开运算符(用于展开可迭代对象(如数组、字符串等)为独立的元素,或者用于将多个元素合并为一个数组或对象)+Object.values()(返回一个给定对象自己的所有可枚举属性值的数组将单选和多选数据选择数据合并到一个数组中,将原数据['题目id_选项值','题目id_选项值']格式化成[题目id,选项值],[题目id,选项值]

let newSelect = [] //单选+多选
newSelect = Object.values({...checkData.value,...radioData.value})
//格式化单选多选合并后的数据为[id,选项] 单选[id,A],多选[id,A],[id,C]
for(let y=0;y<newSelect.length;y++){
  selectData.value.push(newSelect[y].split("_"))
}

查找格式化数据中相同id的数据,比较格式化后的正确答案,比较正确,组合成提交答案要求的格式和校正展示的格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伊朗黑客对以色列科技和教育领域发起破坏性网络攻击

导语 近期&#xff0c;以色列的高等教育和科技领域遭受了一系列破坏性的网络攻击。这些攻击始于2023年1月&#xff0c;旨在部署以前未记录的数据清除恶意软件。在最近的攻击中&#xff0c;攻击者试图窃取个人身份信息和知识产权等敏感数据。本文将介绍这些攻击的具体细节&#…

实施电子采购的6个有效步骤

耗时又费力&#xff0c;手动采购之苦相信大家都受够了&#xff0c;现在越来越多的企业正在实施电子采购策略。根据CIPS的《2022年采购与供应数字化报告》&#xff0c;多达95%的企业在采购与供应商管理中采用了技术。 但采用技术并不能保证立竿见影的效果。企业需要制定好电子采…

word统计全部字符数。

问题描述&#xff1a;在投稿SCI论文时&#xff0c;有时会要求提交一个highlight文档&#xff0c;要求不超过85个字符。 具体如下&#xff1a;maximum 85 characters per bullet point including spaces 这里的字符不单单包括字母和汉字&#xff0c;还包括标点和空格键。那么如…

Linux 安装 Nginx 并将其配置为系统服务(详细图文)

目录 前言安装 Nginx安装依赖项下载Nginx解压Nginx编译和安装防火墙设置启动Nginx 配置 Nginx 为系统服务配置 Nginx 服务文件启动 Nginx 服务设置开机自启动检查 Nginx 状态停止 Nginx 服务重启 Nginx 服务 卸载 Nginx结语 前言 Nginx是一款卓越的高性能Web服务器&#xff0c…

【Unity细节】Json序列化时出现:An item with the same key has already been added. Key:

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

RFID系统

目录 在物联网应用中有三项关键技术 读写器 电子标签 工作原理 阅读器的组成及作用&#xff1a; 电子标签的组成及作用&#xff1a; RFID系统的组成 接口方式 在物联网应用中有三项关键技术 在物联网应用中有三项关键技术 1、传感器技术&#xff1a;这也是计算机应用中…

操作系统引论(一)

操作系统的地位和目标 计算机系统的组成 系统软件是和硬件相关的&#xff0c;这是它本质的特征。 操作系统在计算机系统中的地位 操作系统的设计目标 可扩充性是面向未来的。 操作系统的作用 1&#xff09;用户与计算机硬件系统之间的接口 2&#xff09;计算机系统资源的管…

阿里终面:10亿数据如何快速插入MySQL?

最快的速度把10亿条数据导入到数据库&#xff0c;首先需要和面试官明确一下&#xff0c;10亿条数据什么形式存在哪里&#xff0c;每条数据多大&#xff0c;是否有序导入&#xff0c;是否不能重复&#xff0c;数据库是否是MySQL&#xff1f; 假设和面试官明确后&#xff0c;有如…

第十五届蓝桥杯模拟赛(第一期)

大家好&#xff0c;我是晴天学长&#xff0c;本次分享&#xff0c;制作不易&#xff0c;需要的小伙伴可以点赞关注评论一波哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 还在持续更新中&#xff0c;目前只更新了部分内容。 一 .找数位 问题描述 …

Educational Codeforces Round 12 C 字符串和dp

Educational Codeforces Round 12 C zscoder喜欢简单字符串&#xff01;如果每一对相邻字符都是不同的&#xff0c;则称为简单字符串 t 。例如&#xff0c;ab, aba, zscoder 是简单字符串&#xff0c;而 aa, add 则不简单。 zscoder 给出了一个字符串 s 。他想更改最少的字符…

shell脚本的awk续篇(粗糙版)

sleep 30 #这是睡眠时间 awk的精确筛选&#xff1a; $n{><}:对比数值 $n-"字符串"代表第n个字段包含某个字符串 $n!-"字符串"代表第n个字段不包含某个字符串 $n"字符串" 代表第n个字段为某个字符串 $n!"字符串"代表第n个字…

【教3妹学编程-算法题】2924. 找到冠军 II

3妹&#xff1a;2哥快看&#xff0c;我黑龙江的闺蜜给我发了一个她在打雪仗的视频&#xff0c;好大的雪啊&#xff0c;好欢乐。 2哥&#xff1a;什么&#xff0c;东北不是暴雪吗&#xff0c; 还可以打雪仗。 3妹 :是啊&#xff0c;可是雪停了就可以打雪仗了啊。 2哥&#xff1a…

Netty入门指南之NIO Channel详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言Channe…

【1107】

interface是面向对象编程语言中接口操作的关键字&#xff0c;功能是把所需成员组合起来&#xff0c;用来封装一定功能的集合。 它好比一个模板&#xff0c;在其中定义了对象必须实现的成员&#xff0c;通过类或结构来实现它。 接口不能直接实例化&#xff0c;即ICount icnew iC…

回归模型原理总结及代码实现

前言 本文将介绍回归模型算法&#xff0c;并总结了一些常用的除线性回归模型之外的模型&#xff0c;其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、…

openGauss Meetup(合肥站)精彩回顾 | openGauss合肥用户组正式成立

由openGauss社区、天津南大通用数据技术股份有限公司联合主办的“openGauss Meetup • 合肥站”已于11月4日落下帷幕&#xff0c;此次活动邀请到数据库行业专家与行业同仁共同探讨数据库技术发展创新、数据库产业发展与落地、数据库周边工具构建、生态共建等内容&#xff0c;推…

IDEA项目下不显示target目录或者target目录不完整没有新添加的资源,idea隐藏target目录

文章目录 一、前言二、idea隐藏target目录2.1、idea隐藏target目录2.2、git提交时隐藏target目录 三、idea下显示target目录3.1、解决idea下不显示target目录问题3.2、target显示目录不完整 一、前言 在idea-2020.1.4版本下讲解idea怎么显示或隐藏target目录。 需要知道:如果…

执行mysql-community-libs-8.1.0-1.el8.x86_64.rpm报错依赖检测失败

目录 1.错误信息 2.解决方法 1.错误信息 我是在VMware虚拟机18上的Centos8上的&#xff0c;安装MySQL8.1.0&#xff0c;执行mysql-community-libs-8.1.0-1.el8.x86_64.rpm报错 [rootlocalhost mysql8.1.0]# rpm -ivh mysql-community-libs-8.1.0-1.el8.x86_64.rpm 警告&…

rvt文件发三维服务

一、所需工具 SuperMap iDesktop、Revit、SuperMap-Revit插件、SuperMap iServer。 二、操作流程 BIM数据发三维服务&#xff1a; 1、Revit中打开BIM数据&#xff0c;附加模块—UDB SuperMap Export。 2、打开SuperMap IDesktop&#xff0c;数据源—打开文件型数据源&…

Java入门篇 之 类与对象

本篇碎碎念&#xff1a;博主作为一个三本学生&#xff0c;庆幸自己上了个本科&#xff0c;但是在支付高昂学费的时候认识到&#xff0c;自己要好好学习&#xff0c;不好好学习&#xff0c;难道以后给人端盘子咩&#xff1b;无论是专科还是本科&#xff0c;都不可以自暴自弃&…