vue2实现答题组件

需求

实现一个答题组件,点击正确的选项,该选项背景变绿色;点击错误的选项,该选项背景变红色。不管点击了什么选项,延迟一秒后切换下一题。

每次出题,从题库中选随机选择一道用户此次进入这个页面后还没有做过的题目,如果此次进入这个页面把所有题都做了,则重置,重新开始随机选题。

页面结构

<div class="question">{{questions[selectedQuestionIndex].question}}
</div>
<div class="choices"><divclass="choice"v-for="(item, index) in questions[selectedQuestionIndex].choices":key="item.content"// 当点击了当前的选项,则开始处理背景颜色:style="{ background: selectedChoiceIndex === index ? feedbackColor : '' }" // 用来显示点击之后的背景颜色@click="handleChoice(index)"><span>{{item.index}}</span><span>{{item.content}}</span></div>
</div>

数据结构

data() {return {selectedQuestionIndex: 0, // 当前显示的问题的索引selectedChoiceIndex: null, // 记录用户当前选择的选项索引feedbackColor: '', // 记录选项的反馈颜色answeredQuestions: new Set(), // 已回答题目索引questions: [ // 题库// 1{question: '下列哪一项不是森林生态系统服务的一部分?',choices: [{ index: 'A: ', content: '氧气生产' },{ index: 'B: ', content: '水土保持' },{ index: 'C: ', content: '提供化石燃料' },{ index: 'D: ', content: '生物多样性维持' },],correctChoiceIndex: 2},// 2{question: '碳汇是指什么?',choices: [{ index: 'A: ', content: '大量排放二氧化碳的地方' },{ index: 'B: ', content: '能够吸收并储存二氧化碳的自然系统' },{ index: 'C: ', content: '一种工业过程,用于减少温室气体' },{ index: 'D: ', content: '用于监测大气中二氧化碳水平的技术' },],correctChoiceIndex: 1},]};
},

方法解析

有三个方法:

  • handleChoice:根据用户的选择决定显示什么背景颜色;切换下一题
  • nextQuestion:决定下一题选哪一道;重置选择状态和选项背景颜色
  • resetQuiz:重新开始测试
handleChoice(choiceIndex) {// 判断是否答对const currentQuestion = this.questions[this.selectedQuestionIndex]; // 获取当前问题// 判断用户点击的是否是正确选项,计算对应的背景颜色if (choiceIndex === currentQuestion.correctChoiceIndex) {this.feedbackColor = '#adce74'; // 绿色表示答对} else {this.feedbackColor = '#ea6458'; // 红色表示答错}// 设置选中选项索引// 一旦selectedChoiceIndex有值了,那么页面上就会渲染背景颜色this.selectedChoiceIndex = choiceIndex;// 延迟一段时间切换到下一题setTimeout(() => {this.nextQuestion();}, 1000); // 延迟1秒
},
nextQuestion() {// 将当前题目加入已回答集合this.answeredQuestions.add(this.selectedQuestionIndex);// 筛选未回答的题目索引const unansweredIndexes = this.questions.map((_, index) => index) // 得到一个全是问题编号的数组.filter(index => !this.answeredQuestions.has(index)); // 过滤出不在answeredQuestions里面的问题的序号if (unansweredIndexes.length > 0) {// 随机选取一道未回答的题目const randomIndex = Math.floor(Math.random() * unansweredIndexes.length);this.selectedQuestionIndex = unansweredIndexes[randomIndex];} else {// 如果没有未回答的题目,重置已回答集合并重新开始this.answeredQuestions.clear();this.resetQuiz();}// 重置选中状态this.selectedChoiceIndex = null;this.feedbackColor = '';
},
resetQuiz() {// 重新随机选择一个题目this.selectedQuestionIndex = Math.floor(Math.random() * this.questions.length);
}

组件代码

<template><div class="question-container"><div class="question">{{questions[selectedQuestionIndex].question}}</div><div class="choices"><divclass="choice"v-for="(item, index) in questions[selectedQuestionIndex].choices":key="item.content":style="{ background: selectedChoiceIndex === index ? feedbackColor : '' }"@click="handleChoice(index)"><span>{{item.index}}</span><span>{{item.content}}</span></div></div></div>
</template><script>import {mapMutations} from "vuex";export default {name: "questionDetail",data() {return {selectedQuestionIndex: 0,selectedChoiceIndex: null, // 记录用户当前选择的选项索引feedbackColor: '', // 记录选项的反馈颜色answeredQuestions: new Set(), // 已回答题目索引questions: [// 1{question: '下列哪一项不是森林生态系统服务的一部分?',choices: [{ index: 'A: ', content: '氧气生产' },{ index: 'B: ', content: '水土保持' },{ index: 'C: ', content: '提供化石燃料' },{ index: 'D: ', content: '生物多样性维持' },],correctChoiceIndex: 2},// 2{question: '碳汇是指什么?',choices: [{ index: 'A: ', content: '大量排放二氧化碳的地方' },{ index: 'B: ', content: '能够吸收并储存二氧化碳的自然系统' },{ index: 'C: ', content: '一种工业过程,用于减少温室气体' },{ index: 'D: ', content: '用于监测大气中二氧化碳水平的技术' },],correctChoiceIndex: 1},]};},methods: {...mapMutations(['addQuestion']),handleChoice(choiceIndex) {// 判断是否答对const currentQuestion = this.questions[this.selectedQuestionIndex];if (choiceIndex === currentQuestion.correctChoiceIndex) {this.feedbackColor = '#adce74'; // 绿色表示答对this.addQuestion();} else {this.feedbackColor = '#ea6458'; // 红色表示答错}// 设置选中选项索引this.selectedChoiceIndex = choiceIndex;// 延迟一段时间切换到下一题setTimeout(() => {this.nextQuestion();}, 1000); // 延迟1秒},nextQuestion() {// 将当前题目加入已回答集合this.answeredQuestions.add(this.selectedQuestionIndex);// 筛选未回答的题目索引const unansweredIndexes = this.questions.map((_, index) => index).filter(index => !this.answeredQuestions.has(index));if (unansweredIndexes.length > 0) {// 随机选取一道未回答的题目const randomIndex = Math.floor(Math.random() * unansweredIndexes.length);this.selectedQuestionIndex = unansweredIndexes[randomIndex];} else {// 如果没有未回答的题目,重置已回答集合并重新开始this.answeredQuestions.clear();this.resetQuiz();}// 重置选中状态this.selectedChoiceIndex = null;this.feedbackColor = '';},resetQuiz() {// 重新随机选择一个题目this.selectedQuestionIndex = Math.floor(Math.random() * this.questions.length);}}};
</script><style scoped lang="scss">
.question-container {width: 98%;height: calc(100vh - 210px);margin-top: 15px;padding: 0 15px 0 15px;//border: 1px red solid;overflow: auto;.question {font-family: 'SanJinSong-Cu', serif;color: #7c9a92;font-size: 35px;}.choices {margin-top: 30px;display: flex;flex-direction: column;gap: 15px;.choice {box-sizing: border-box;padding: 10px 20px;color: white;font-family: 'SanJinSong-Xi', serif;font-size: 25px;width: 100%;min-height: 80px;display: flex;align-items: center;border-radius: 8px;background: linear-gradient(to right, #1F6D5E, #43D6B9);cursor: pointer;transition: background 0.3s ease;}}
}
</style>

效果演示

在这里插入图片描述

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

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

相关文章

3D相框案例讲解(详细)

前言 通过现阶段的学习&#xff0c;我们已经掌握了HTML&#xff0c;CSS和JS部分的相关知识点&#xff0c;现在让我们通过一篇案例&#xff0c;来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…

SuperMap GIS基础产品FAQ集锦(20241216)

一、SuperMap iDesktopX 问题1&#xff1a;想问一下 SuperMap iDesktopX可以修改倾斜入库后数据的位置吗 11.2.1 【解决办法】在配置文件&#xff08;*.scp&#xff09;中找打position属性&#xff0c;修改其中的xyz值&#xff0c;用于改变位置&#xff1b;修改后如果想要相机…

2.11.静态链表

一.静态链表的基本概念&#xff1a; 1.上图说明&#xff1a;索引为0处是头结点&#xff0c;头结点不存储数据&#xff0c;但存储下一个结点的数组下标&#xff0c;本例中头结点里存储的下一个结点的数组下标为2&#xff0c;即索引为2的结点为头结点后的第一个结点&#xff0c;以…

【Childishness and Playfulness】

奥迪双钻&#xff0c;旋风冲锋龙卷风&#xff0c;巨无霸 智能芯片 东西南北中&#xff0c;好像已经忘了怎么折叠了&#xff0c;折千纸鹤&#xff0c;折小船&#xff0c;折舞狮&#xff0c;折飞机 红外线小灯&#xff0c;纽扣电池&#xff0c;各种形状投影 爷爷的手电筒&am…

【C++初阶】第9课—标准模板库STL(string_3)

文章目录 1. string类对象的查找操作1.1 c_str返回c格式字符串1.2 substr获取string类对象子串1.3 find和rfind查找字符串内容1.4 find_first_of与find_first_not_of1.5 find_last_of与find_last_not_of1.6 copy复制string类对象内的字符串内容1.7 compare对比string类字符串1.…

关于目标检测YOLO 各版本区别v1-v11/vX/vR

概述 YOLO&#xff08;You Only Look Once&#xff0c;你只看一次&#xff09;是一系列开创性的实时目标检测模型&#xff0c;它们彻底改变了计算机视觉领域。由Joseph Redmon开发&#xff0c;后续版本由不同研究人员迭代&#xff0c;YOLO模型以其在图像中检测对象的高速度和准…

海康摄像头,WEB有插件开发

1.引用js <script type"text/javaScript" src"./hk/webVideoCtrl.js"></script> <script type"text/javaScript" src"./hk/cryptico.min.js"></script> <script type"text/javaScript" src"…

【教程】如何下载WandB平台的运行数据?

【教程】如何下载WandB平台的运行数据&#xff1f; 前言 CSDN主页&#xff1a;https://blog.csdn.net/rvdgdsva 博客园主页&#xff1a;https://www.cnblogs.com/hassle Weights & Biases (WandB)是一个用于机器学习的平台&#xff0c;它提供了一套工具来帮助你跟踪、比…

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…

【Linux】自定义项目-进度条

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 准备工作&#xff1a;"\r"与"\n"字符 ①&#xff1a;基本含义 在C语言和Linux环境中&#xff0c;\r是回车符&#xff0c;\n是换行符&#xff0c;用于控制文本格式和输出…

Linux从0到1——初识线程【什么是线程/线程控制/详解tid】

Linux从0到1——初识线程 1. 什么是线程&#xff1f;1.1 线程的概念1.2 结合代码理解线程1.3 重谈地址空间1.4 线程的优缺点 2. 线程异常和线程用途3. Linux进程VS线程4. 详解pthread_create的arg参数4.1 给线程传参4.2 一次创建多个线程 5. 线程控制5.1 线程退出5.2 线程分离5…

[免费]SpringBoot+Vue校园社团管理系统(优质版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园社团管理系统(优质版)&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园社团管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅速发展&#x…

114 二叉树展开为链表

解题思路&#xff1a; \qquad 题目中已经明确&#xff0c;要用先序遍历的顺序展开&#xff0c;那么就需要按照“中-左-右”的顺序遍历二叉树&#xff0c;剩下的问题在于如何在遍历过程中完成链表指针的更新。 \qquad 由于“右子节点”需要链接到左子树最后一个节点之后&#…

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…

类OCSP靶场-Kioptrix系列-Kioptrix Level 1

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3 目录爆破 1.4. 敏感信息 2.根据服务搜索漏洞 2.1. 搜索exp 2.2. 编译exp 2.3. 查看exp使用方法&#xff0c;并利用 3. 提权 二、第二种方法 一、前情提要 Kioptrix Level是免费靶场&#x…

Golang囊地鼠gopher

开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…

快速上手Spring注解、SpringAop

1 Spring 注解的使用 1 IOC 的概念 IOC&#xff08;Inversion of Control&#xff09;&#xff1a;控制反转。 使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c;此思想称为控制反转。通俗的讲就…

前端面经-总结篇 http

下面是我在过去12天内&#xff0c;学习关于http的前端面经汇总。现在只是一些很基础的知识&#xff0c;后续还会补充&#xff0c;算是对之前学习的一个总结。 前端面经整理-CSDN博客 我主要参考的题目来源在这里。 本地存储 localstorage&#xff08;本地存储&#xff09;和…

功能篇:SpringBoot 实现静态、动态定时任务,本地动态定时任务调度

在Spring Boot中实现静态和动态定时任务可以通过使用Scheduled注解来配置静态的调度任务&#xff0c;以及通过编程方式创建动态的调度任务。下面我将分别介绍这两种方式。 ### 静态定时任务 对于静态定时任务&#xff0c;你可以直接在方法上使用Scheduled注解&#xff0c;并指定…

服务器ubuntu重装系统后将原来的用户进行关联

服务器ubuntu重装系统后将原来的用户数据进行关联 关联用户到已存在目录 sudo useradd user_name -m -s /bin/bash -d /home***/name添加sudo权限 vim /etc/sudoers# 文件末尾添加 user_name ALL(ALL:ALL) ALL更改拥有者 sudo chown -R user_name:user_name /home***/na…