国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用

這篇具有很好參考價值的文章主要介紹了Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一頁多題,類型包括單選(單選、判斷)和多選,radio和checkbox混合使用,答案檢驗數(shù)據(jù)匹配,正確答案格式化,答案提交數(shù)據(jù)格式化,數(shù)據(jù)提交。

效果:

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用,Millia's work,vue.js,javascript,前端

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用,Millia's work,vue.js,javascript,前端

數(shù)據(jù)獲?。?/h2>

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用,Millia's work,vue.js,javascript,前端

數(shù)據(jù)提交:

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用,Millia's work,vue.js,javascript,前端

HTML:

<template>

<!--其他HTML結(jié)構(gòu)-->

<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結(jié)構(gòu)-->

</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請?zhí)崾?import { showToast } from 'vant';

//使用vue的getCurrentInstance 方法獲取當(dāng)前組件實例
const { proxy } = getCurrentInstance()

//獲取vuex數(shù)據(jù)
let store = useStore();

//使用router
const route = useRoute()


//獲取題目列表數(shù)據(jù)
let questionData = ref([]) //答題數(shù)據(jù)
let answerData = ref([]) //格式化后答案
const getQuestion = () => {

    /*axois獲取題目數(shù)據(jù)*/

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

    questionData.value = response.data.data.data

    //格式化數(shù)據(jù)答案為[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 //查找次數(shù)
      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 = '' //查找對應(yīng)id的下標(biāo)
        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 = {
       /*其他參數(shù) category_id:proxy.$route.params.category_id,*/
        ti_str:enterData.toString(),
      }

      /*數(shù)據(jù)提交*/

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

      /*數(shù)據(jù)提交*/

    }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;}

解釋:

數(shù)據(jù)里的答案為:A_B_C_D

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

提交數(shù)據(jù)的答案為:題目id-A_B_C_D

通過 :value="list.id+'_'+radio.name"? 和??:value="list.id+'_'+checkbox.name" 將選中數(shù)據(jù)統(tǒng)一為題目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">

展開運算符(用于展開可迭代對象(如數(shù)組、字符串等)為獨立的元素,或者用于將多個元素合并為一個數(shù)組或?qū)ο?/strong>)+Object.values()(返回一個給定對象自己的所有可枚舉屬性值的數(shù)組將單選和多選數(shù)據(jù)選擇數(shù)據(jù)合并到一個數(shù)組中,將原數(shù)據(jù)['題目id_選項值','題目id_選項值']格式化成[題目id,選項值],[題目id,選項值]

let newSelect = [] //單選+多選
newSelect = Object.values({...checkData.value,...radioData.value})
//格式化單選多選合并后的數(shù)據(jù)為[id,選項] 單選[id,A],多選[id,A],[id,C]
for(let y=0;y<newSelect.length;y++){
  selectData.value.push(newSelect[y].split("_"))
}

Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用,Millia's work,vue.js,javascript,前端

查找格式化數(shù)據(jù)中相同id的數(shù)據(jù),比較格式化后的正確答案,比較正確,組合成提交答案要求的格式和校正展示的格式。文章來源地址http://www.zghlxwxcb.cn/news/detail-745283.html

到了這里,關(guān)于Vue3:一頁多題答案提示及循環(huán)radio和checkbox混合使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue3【列表渲染】v-for 詳細(xì)介紹(vue中的“循環(huán)”)

    vue3【列表渲染】v-for 詳細(xì)介紹(vue中的“循環(huán)”)

    在本文之前已經(jīng)有文章簡單概要介紹過vue中的渲染,點擊幫你快速復(fù)習(xí)????,包括 條件渲染 和 列表渲染 。 二者同樣重要,但是 對于項目而言,使用更多的是列表渲染,主要表現(xiàn)為“循環(huán)”。 下面讓我們繼續(xù)深入地了解列表渲染的相關(guān)內(nèi)容吧~?????? 我們可以使用 v-f

    2024年02月22日
    瀏覽(25)
  • vite vue3+ts @引入無提示/解決提示報錯

    vite vue3+ts @引入無提示/解決提示報錯

    1. setting.json? 這時候已經(jīng)有提示了 但是ts會報錯? ?tsconfig.json? 以@開頭代表src目錄下 以#開頭代表ts目錄下? 配置好后 重新引入 沒有紅色波浪線但是 vite不認(rèn)識 @符號 運行項目還是會報錯 ?這時候就需要在vite.config.ts中添加配置 如果path會報錯 需要下載一下@types/node 再重啟下

    2024年02月15日
    瀏覽(20)
  • Vue3 select循環(huán)多個,選項option不能重復(fù)被選

    Vue3 select循環(huán)多個,選項option不能重復(fù)被選

    環(huán)境 :vue3+ts+vite+element plus 實現(xiàn)目標(biāo) :Vue3 select循環(huán)多個,當(dāng)其中一個option值被選后,其他select里面不能再重復(fù)選擇該option值。第二種,當(dāng)其中一個option值被選后,其他select里面就不出現(xiàn)被選option的值 第一種 :代碼如下 效果: 第二種: 效果: 或者用script setup的寫法 如果沒

    2024年02月10日
    瀏覽(27)
  • Vue3 - 實現(xiàn)路由 “新開一頁“ 進行頁面跳轉(zhuǎn)功能,Router 路由跳轉(zhuǎn)時在新窗口打開頁面(網(wǎng)站跳轉(zhuǎn)頁面時瀏覽器新開頁簽打開網(wǎng)頁,支持在頁面、純 js/ts 文件中使用,詳細(xì)示例代碼教程)

    Vue3 - 實現(xiàn)路由 “新開一頁“ 進行頁面跳轉(zhuǎn)功能,Router 路由跳轉(zhuǎn)時在新窗口打開頁面(網(wǎng)站跳轉(zhuǎn)頁面時瀏覽器新開頁簽打開網(wǎng)頁,支持在頁面、純 js/ts 文件中使用,詳細(xì)示例代碼教程)

    網(wǎng)上這方面教程很少,本文提供多種解決方案,適用于任何場景。 本文 實現(xiàn)了在 vue3 項目開發(fā)中,當(dāng)頁面跳轉(zhuǎn)時瀏覽器打開新窗口(新頁簽)跳轉(zhuǎn),Router 路由跳轉(zhuǎn)并新開一頁教程, 無論您是在普通頁面、純 js/ts 文件中,都可以使用, 如下圖所示,當(dāng)執(zhí)行路由跳轉(zhuǎn)時瀏覽器

    2024年02月03日
    瀏覽(32)
  • 【實操】vue+element UI tab頁多表單合并校驗提交

    【實操】vue+element UI tab頁多表單合并校驗提交

    一個頁面中tab欄切換多個form表單組件,只有一個保存按鈕。需要把各組件下的表達數(shù)據(jù)合并校驗提交。 父組件通過兩次調(diào)用$refs獲取子組件的dom元素以及組件內(nèi)部form的dom元素。 通過循環(huán)表單項獲取validate值獲取校驗結(jié)果,通過Promise.all合并表單。 子組件內(nèi)部getData方法返回表

    2024年02月11日
    瀏覽(18)
  • vue3引入.vue文件以及.ts文件時提示找不到模塊

    1.找不到vue文件的,是因為ts無法解析我們的vue結(jié)尾的文件,所以需要在src目錄下, 新建一個d.ts結(jié)尾的文件(可以叫env.d.ts) 然后里面這樣寫就可以 2,找不到ts文件就更正常了,我們需要在tsconfig.json里面進行配置(沒有的話就新建一個,在根src同級的目錄下面)。就直接復(fù)制就

    2024年02月11日
    瀏覽(99)
  • 如何解決vue3.0+typescript項目提示找不到模塊“./App.vue

    如何解決vue3.0+typescript項目提示找不到模塊“./App.vue

    一、解決方案如下:需在項目目錄下加上下面這段代碼即可!如果沒有vite-env.d.ts目錄需要繼續(xù)往下看 二、如果沒有創(chuàng)建vite-env.d.ts這個文件,需要在和main.ts同級目錄創(chuàng)建一個vite-env.d.ts文件,如圖 創(chuàng)建好后,可能你沒有tsconfig.json文件,那么你還要新創(chuàng)建一個tsconfig.json文件,

    2024年02月10日
    瀏覽(19)
  • vite+vue3+ts項目中提示無法找到模塊

    今天在開發(fā)過程中碰到了導(dǎo)入模塊時提示無法找到模塊這個問題,分享一下我的解決思路 首先產(chǎn)生這個錯誤是: 無法找到模塊XXX,并且提示\\\'XXX\\\' is declared but its value is never read 產(chǎn)生這個問題的原因是我們使用了ts語法,他只能識別.ts文件,并不能識別.vue文件,所以在引入組件

    2024年02月11日
    瀏覽(29)
  • 解決vue3使用iconpark控制臺預(yù)警提示問題

    解決vue3使用iconpark控制臺預(yù)警提示問題

    最近在項目中使用 iconpark-icon 來管理圖標(biāo),一切都很順利,引入鏈接后,圖標(biāo)正常顯示,沒有報錯。但是控制臺卻發(fā)出了預(yù)警信息。 [Vue warn]: Failed to resolve component: iconpark-icon If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. 雖說不

    2024年02月04日
    瀏覽(24)
  • vue3中使用codemirror6增加代碼提示功能

    1、安裝依賴 // 安裝codemirror、語言包、主題、自動補全 本人安裝的版本是 2、創(chuàng)建編輯器

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包