如何使用 VueJS 开发前端测验应用程序?

言鼎科技 2023-06-19 417

创建 VueJS 应用程序

在这里,我们将使用 Vue 2。运行以下命令来创建 VueJs 应用程序。


vue 创建测验应用程序

你会看到这样的东西。


现在,借助以下命令导航到目录并运行服务器。


光盘测验添加npm 运行服务

本地主机将显示默认屏幕,如下所示。


创建用户界面

每个 Vue 组件都包含三个部分:

  • <template> 包含组件的 HTML 代码

  • <script> 包含业务逻辑

  • <style> 包含用于组件样式的 CSS 代码

对于我们的演示应用程序,我们将有两个组件:

  • 测验组件

  • 模态组件

文件夹结构

这是我们的文件夹结构的图像。这将是一个非常简单的结构。


现在让我们看看不同的文件,看看我们要做什么。记下文件名。

在这个瞬息万变的编程和开发世界中,让您的应用程序保持最新可能非常具有挑战性。
从我们这里聘请 Vue.js 开发人员,他们准备好与您的流程一起飞行,以战略性地实现您的业务目标。

App.vue 设置

App.vue 是所有组件(这里是 Quiz 和 Modal 组件)的父文件。让我们定义我们的组件。UI模板参考如下代码。


<模板>
<div id="应用程序">
  <h2>测验应用</h2>
  <quiz @quiz-completed="handleQuizCompleted" :key="quizKey" />
  <自定义模态
    v-show="showModal"
    标头=“恭喜!”
    subheader="你已经完成了测验!"
    :得分=“得分”
    @reload="更新测验"
    @close="showModal = false"
  />
</div></模板>

解释

代码非常简单。

  • v – show="show Modal"会根据这个有条件地渲染模态。显示模态。

  • 分数是从数据属性发送到模态的动态道具。

  • header和 subheader是两个静态属性。

  • 重新加载和关闭是从模态页脚调用的自定义事件。

继续 < script > 标签。



解释

该逻辑将有两个方法
1. handle Quiz completed():它从 Quiz 组件接收用户分数并将其设置为本地状态 'this。分数'。它由我们在 Quiz 组件中定义的自定义事件“quiz-completed”触发。
2. update Quiz():该方法将键绑定到“quiz Key”数据属性。它将由 CustomModal 组件的“重新加载”事件进一步触发,将“测验键”递增一个。

创建组件

进一步推进我们的教程,使用 VueJS 开发前端测验应用程序。接下来我们将从我们的组件开始:Quiz Component 和 CustomModal Component。

CustomModal.vue

文件 CustomModal.vue 将包含模态的 UI 和逻辑代码。请参考下面的代码。


<模板>
<转换名称="模态">
  <div class="modal-mask">
    <div class="modal-wrapper">
      <div class="模态容器">
        <div class="modal-header">
          <h2>{{ 标题}}</h2>
          <h3>{{ 子标题 }}</h3>
        </div>

        <div class="modal-body">
          <div id="分数">
            你回答了
            <span class="高亮">
              {{
                数学.floor(
                  (score.correctlyAnsweredQuestions / score.allQuestions) *
                    100
                )
              }}
              % 正确!
            </span>
            已回答
            <span class="高亮">
              {{ score.correctlyAnsweredQuestions }} 出
              {{ score.allQuestions }}
            </span>
            问题。
          </div>
        </div>

        <div class="模态页脚">
          <按钮
            id="再玩一次"
            类=“按钮页脚”
            @click="$emit('重新加载')"
          >
            再玩一次
          </按钮>
          <按钮
            id="关闭按钮"
            类=“按钮页脚”
            @click="$emit('关闭')"
          >
            关闭
          </按钮>
        </div>
      </div>
    </div>
  </div>
</过渡></模板>

解释

  • score 道具包含用户正确回答了多少问题,还包含问题总数。

  • 我们使用从 Quiz 组件的自定义事件中收到的 score 道具。模态页脚将有两个按钮发出自定义事件以重新加载和关闭模态。

测验.vue

这是测验组件的代码。


<模板>
<div 类="容器">
  <div class="correctAnswers">
    你有
    <strong>{{ correctAnswers }} 正确 {{ pluralizeAnswer }}!</strong>
  </div>
  <div class="correctAnswers">
    目前在 {{ index + 1 }} 的 {{ questions.length }} 中
  </div>

  <h2 v-html="loading ? 'Loading...' : currentQuestion.question" ></h2>
  <!-- 只显示第一个问题 -->
  <form v-if="currentQuestion">
    <按钮
      v-for="在 currentQuestion.answers 中回答"
      :index="currentQuestion.key"
      :键=“答案”
      v-html="答案"
      @click.prevent="handleClick"
    ></按钮>
  </表格>
</div></模板>

解释

  • “加载?'Loading...' : currentQuestion.question”将检查 loading 属性,并根据它决定'Loading...'currentQuestion

  • 每个问题的答案都将存储在数组 answers 中。因此,我们将在“v-for”的帮助下循环答案并将每个答案显示为按钮元素。这样,v-html=”answer” 将在按钮上显示答案。

  • 该逻辑将由稍后在脚本部分中看到的handleClick执行。

这是 Quiz 组件的逻辑部分。让我们一次选择一种方法,看看逻辑是什么。

获取问题

道具“问题”是用一个空数组初始化的。当“loading”为真时,我们将使用Trivia API获取问题,并在挂载组件时将它们推送到数组中。在这里,每次调用 API 时都会提取五个问题。


异步获取问题(){
    this.loading = true;
    //从API获取问题
    让响应=等待获取(
      “https://opentdb.com/api.php?amount=5&category=21&type=multiple”
    );
    让索引= 0;//识别单一答案
    让 data = await response.json();
    让问题 = data.results.map((问题) => {
      问题.答案= [
        问题.correct_answer,
        ...question.incorrect_answers,
      ];
      //打乱上面的数组
      for (let i = question.answers.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [问题.答案[i],问题.答案[j]] = [
          问题.答案[j],
          问题.答案[i],
        ];
      }
      //添加正确的答案和关键
      问题.rightAnswer = null;
      问题。关键=索引;
      索引++;
      返回问题;
    });
    this.questions = 问题;
    this.loading = false;
  },

显示当前问题

计算属性currentQuestion()将返回当前索引处的当前问题。


当前问题(){
    如果 (this.questions !== []) {
      返回 this.questions[this.index];
    }
    返回空值;
  },

计算正确答案

下面的代码片段用于计算正确答案。


正确答案() {
    如果(this.questions && this.questions.length > 0){
      让 streakCounter = 0;
      this.questions.forEach(函数(问题){
        如果(!question.rightAnswer){
          返回;
        } else if (question.rightAnswer === true) {
          条纹计数器++;
        }
      });
      返回条纹计数器;
    } 别的 {
      返回 ” - ”;
    }
  },

计算分数

以下逻辑将计算分数。' score ()'将使用缩减程序数组原型将当前问题数组缩减为n个数字。它返回我们在customModal组件中使用的“分数”对象。


分数() {
    如果 (this.questions !== []) {
      返回 {
        所有问题:this.questions.length,
        回答问题:
    this.questions.reduce((count, currentQuestion) => {
          如果(currentQuestion.userAnswer){
            // userAnswer 在用户回答问题时设置,无论是对还是错
            计数++;
          }
          返回计数;
        }, 0),
        正确回答问题:this.questions.reduce(
          (计数,当前问题)=> {
            如果(currentQuestion.rightAnswer){
              // rightAnswer 为真,如果用户回答正确
              计数++;
            }
            返回计数;
          },
          0
        ),
      };
    } 别的 {
      返回 {
        所有问题:0,
        回答问题: 0,
        正确回答问题:0,
      };
    }
  },

完成测验的观察者

我们将保持对quizCompleted()的观察,如果测验完成,它将发出事件并使用this.score向 App 组件显示分数。


手表: {
  测验完成(完成){
    完全的 &&
      设置超时(()=> {
        this.$emit("测验完成", this.score);
      }, 3000);
  },
},

检查正确答案

检查正确答案。为此,它将比较userAnswer,用户给出的答案,和correct_answer,API 给出的答案。它进一步相应地设置'.rightAnswer''.wrongAnswer'并管理索引状态以继续下一个问题。


checkCorrectAnswer(e,索引){
    让 question = this.questions[index];
    如果(问题。用户答案){
      如果 (this.index < this.questions.length - 1) {
        设置超时(
          功能 () {
            这个.index += 1;
          }.bind(这个),
          3000
        );
      }
      如果(question.userAnswer === question.correct_answer){
        /* 如果用户回答正确,则在 Button 上设置类,以动画 joyfulButton 庆祝正确答案 */
        e.target.classList.add("rightAnswer");
        /* 将 rightAnswer on question 设置为 true,计算属性可以跟踪连续 20 个问题 */
        this.questions[index].rightAnswer = true;
      } 别的 {
        /* 将用户的回答标记为错误答案 */
        e.target.classList.add("wrongAnswer");
        this.questions[index].rightAnswer = false;
        /* 显示正确答案 */
        让 correctAnswer = this.questions[index].correct_answer;
        让 allButtons = document.querySelectorAll(`[index="${index}"]`);
        allButtons.forEach(函数(按钮){
          如果(按钮。innerHTML === correctAnswer){
            button.classList.add("showRightAnswer");
          }
        });
      }
    }
  },

运行服务器

运行服务器后,点击浏览器,您的用户界面将如下所示


点击答案你会知道你的答案是否正确,同时显示下一个问题。在测验结束时,您将获得显示正确答案的计分板。

Github 存储库:VueJS 测验应用程序

请随意访问 github 源代码:VueJS Quiz App并克隆存储库以使用代码。

结论

所以,这是关于如何使用 VueJS 开发前端测验应用程序。您是 VueJS 的热衷学习者吗?如果是,那么VueJS 教程页面适合您!访问不同的教程并开始深入学习高级 VueJS 知识,或者也完善您的 VueJS 基础知识。

言鼎科技主做软件开发,微信小程序,网站开发,软件外包,手机APP开发。如有需要记得联系我们!

The End