如何使用 VueJS 開發(fā)前端測驗(yàn)應(yīng)用程序?

言鼎科技 2023-06-19 413

創(chuàng)建 VueJS 應(yīng)用程序

在這里,我們將使用 Vue 2。運(yùn)行以下命令來創(chuàng)建 VueJs 應(yīng)用程序。


vue 創(chuàng)建測驗(yàn)應(yīng)用程序

你會看到這樣的東西。


現(xiàn)在,借助以下命令導(dǎo)航到目錄并運(yùn)行服務(wù)器。


光盤測驗(yàn)添加npm 運(yùn)行服務(wù)

本地主機(jī)將顯示默認(rèn)屏幕,如下所示。


創(chuàng)建用戶界面

每個 Vue 組件都包含三個部分:

  • <template> 包含組件的 HTML 代碼

  • <script> 包含業(yè)務(wù)邏輯

  • <style> 包含用于組件樣式的 CSS 代碼

對于我們的演示應(yīng)用程序,我們將有兩個組件:

  • 測驗(yàn)組件

  • 模態(tài)組件

文件夾結(jié)構(gòu)

這是我們的文件夾結(jié)構(gòu)的圖像。這將是一個非常簡單的結(jié)構(gòu)。


現(xiàn)在讓我們看看不同的文件,看看我們要做什么。記下文件名。

在這個瞬息萬變的編程和開發(fā)世界中,讓您的應(yīng)用程序保持最新可能非常具有挑戰(zhàn)性。
從我們這里聘請 Vue.js 開發(fā)人員,他們準(zhǔn)備好與您的流程一起飛行,以戰(zhàn)略性地實(shí)現(xiàn)您的業(yè)務(wù)目標(biāo)。

App.vue 設(shè)置

App.vue 是所有組件(這里是 Quiz 和 Modal 組件)的父文件。讓我們定義我們的組件。UI模板參考如下代碼。


<模板>
<div id="應(yīng)用程序">
  <h2>測驗(yàn)應(yīng)用</h2>
  <quiz @quiz-completed="handleQuizCompleted" :key="quizKey" />
  <自定義模態(tài)
    v-show="showModal"
    標(biāo)頭=“恭喜!”
    subheader="你已經(jīng)完成了測驗(yàn)!"
    :得分=“得分”
    @reload="更新測驗(yàn)"
    @close="showModal = false"
  />
</div></模板>

解釋

代碼非常簡單。

  • v – show="show Modal"會根據(jù)這個有條件地渲染模態(tài)。顯示模態(tài)。

  • 分?jǐn)?shù)是從數(shù)據(jù)屬性發(fā)送到模態(tài)的動態(tài)道具。

  • header和 subheader是兩個靜態(tài)屬性。

  • 重新加載和關(guān)閉是從模態(tài)頁腳調(diào)用的自定義事件。

繼續(xù) < script > 標(biāo)簽。



解釋

該邏輯將有兩個方法
1. handle Quiz completed():它從 Quiz 組件接收用戶分?jǐn)?shù)并將其設(shè)置為本地狀態(tài) 'this。分?jǐn)?shù)'。它由我們在 Quiz 組件中定義的自定義事件“quiz-completed”觸發(fā)。
2. update Quiz():該方法將鍵綁定到“quiz Key”數(shù)據(jù)屬性。它將由 CustomModal 組件的“重新加載”事件進(jìn)一步觸發(fā),將“測驗(yàn)鍵”遞增一個。

創(chuàng)建組件

進(jìn)一步推進(jìn)我們的教程,使用 VueJS 開發(fā)前端測驗(yàn)應(yīng)用程序。接下來我們將從我們的組件開始:Quiz Component 和 CustomModal Component。

CustomModal.vue

文件 CustomModal.vue 將包含模態(tài)的 UI 和邏輯代碼。請參考下面的代碼。


<模板>
<轉(zhuǎn)換名稱="模態(tài)">
  <div class="modal-mask">
    <div class="modal-wrapper">
      <div class="模態(tài)容器">
        <div class="modal-header">
          <h2>{{ 標(biāo)題}}</h2>
          <h3>{{ 子標(biāo)題 }}</h3>
        </div>

        <div class="modal-body">
          <div id="分?jǐn)?shù)">
            你回答了
            <span class="高亮">
              {{
                數(shù)學(xué).floor(
                  (score.correctlyAnsweredQuestions / score.allQuestions) *
                    100
                )
              }}
              % 正確!
            </span>
            已回答
            <span class="高亮">
              {{ score.correctlyAnsweredQuestions }} 出
              {{ score.allQuestions }}
            </span>
            問題。
          </div>
        </div>

        <div class="模態(tài)頁腳">
          <按鈕
            id="再玩一次"
            類=“按鈕頁腳”
            @click="$emit('重新加載')"
          >
            再玩一次
          </按鈕>
          <按鈕
            id="關(guān)閉按鈕"
            類=“按鈕頁腳”
            @click="$emit('關(guān)閉')"
          >
            關(guān)閉
          </按鈕>
        </div>
      </div>
    </div>
  </div>
</過渡></模板>

解釋

  • score 道具包含用戶正確回答了多少問題,還包含問題總數(shù)。

  • 我們使用從 Quiz 組件的自定義事件中收到的 score 道具。模態(tài)頁腳將有兩個按鈕發(fā)出自定義事件以重新加載和關(guān)閉模態(tài)。

測驗(yàn).vue

這是測驗(yàn)組件的代碼。


<模板>
<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 屬性,并根據(jù)它決定'Loading...'currentQuestion。

  • 每個問題的答案都將存儲在數(shù)組 answers 中。因此,我們將在“v-for”的幫助下循環(huán)答案并將每個答案顯示為按鈕元素。這樣,v-html=”answer” 將在按鈕上顯示答案。

  • 該邏輯將由稍后在腳本部分中看到的handleClick執(zhí)行。

這是 Quiz 組件的邏輯部分。讓我們一次選擇一種方法,看看邏輯是什么。

獲取問題

道具“問題”是用一個空數(shù)組初始化的。當(dāng)“l(fā)oading”為真時,我們將使用Trivia API獲取問題,并在掛載組件時將它們推送到數(shù)組中。在這里,每次調(diào)用 API 時都會提取五個問題。


異步獲取問題(){
    this.loading = true;
    //從API獲取問題
    讓響應(yīng)=等待獲?。?br/>       “https://opentdb.com/api.php?amount=5&category=21&type=multiple”
    );
    讓索引= 0;//識別單一答案
    讓 data = await response.json();
    讓問題 = data.results.map((問題) => {
      問題.答案= [
        問題.correct_answer,
        ...question.incorrect_answers,
      ];
      //打亂上面的數(shù)組
      for (let i = question.answers.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [問題.答案[i],問題.答案[j]] = [
          問題.答案[j],
          問題.答案[i],
        ];
      }
      //添加正確的答案和關(guān)鍵
      問題.rightAnswer = null;
      問題。關(guān)鍵=索引;
      索引++;
      返回問題;
    });
    this.questions = 問題;
    this.loading = false;
  },

顯示當(dāng)前問題

計(jì)算屬性currentQuestion()將返回當(dāng)前索引處的當(dāng)前問題。


當(dāng)前問題(){
    如果 (this.questions !== []) {
      返回 this.questions[this.index];
    }
    返回空值;
  },

計(jì)算正確答案

下面的代碼片段用于計(jì)算正確答案。


正確答案() {
    如果(this.questions && this.questions.length > 0){
      讓 streakCounter = 0;
      this.questions.forEach(函數(shù)(問題){
        如果(!question.rightAnswer){
          返回;
        } else if (question.rightAnswer === true) {
          條紋計(jì)數(shù)器++;
        }
      });
      返回條紋計(jì)數(shù)器;
    } 別的 {
      返回 ” - ”;
    }
  },

計(jì)算分?jǐn)?shù)

以下邏輯將計(jì)算分?jǐn)?shù)。' score ()'將使用縮減程序數(shù)組原型將當(dāng)前問題數(shù)組縮減為n個數(shù)字。它返回我們在customModal組件中使用的“分?jǐn)?shù)”對象。


分?jǐn)?shù)() {
    如果 (this.questions !== []) {
      返回 {
        所有問題:this.questions.length,
        回答問題:
    this.questions.reduce((count, currentQuestion) => {
          如果(currentQuestion.userAnswer){
            // userAnswer 在用戶回答問題時設(shè)置,無論是對還是錯
            計(jì)數(shù)++;
          }
          返回計(jì)數(shù);
        }, 0),
        正確回答問題:this.questions.reduce(
          (計(jì)數(shù),當(dāng)前問題)=> {
            如果(currentQuestion.rightAnswer){
              // rightAnswer 為真,如果用戶回答正確
              計(jì)數(shù)++;
            }
            返回計(jì)數(shù);
          },
          0
        ),
      };
    } 別的 {
      返回 {
        所有問題:0,
        回答問題: 0,
        正確回答問題:0,
      };
    }
  },

完成測驗(yàn)的觀察者

我們將保持對quizCompleted()的觀察,如果測驗(yàn)完成,它將發(fā)出事件并使用this.score向 App 組件顯示分?jǐn)?shù)。


手表: {
  測驗(yàn)完成(完成){
    完全的 &&
      設(shè)置超時(()=> {
        this.$emit("測驗(yàn)完成", this.score);
      }, 3000);
  },
},

檢查正確答案

檢查正確答案。為此,它將比較userAnswer,用戶給出的答案,和correct_answer,API 給出的答案。它進(jìn)一步相應(yīng)地設(shè)置'.rightAnswer''.wrongAnswer'并管理索引狀態(tài)以繼續(xù)下一個問題。


checkCorrectAnswer(e,索引){
    讓 question = this.questions[index];
    如果(問題。用戶答案){
      如果 (this.index < this.questions.length - 1) {
        設(shè)置超時(
          功能 () {
            這個.index += 1;
          }.bind(這個),
          3000
        );
      }
      如果(question.userAnswer === question.correct_answer){
        /* 如果用戶回答正確,則在 Button 上設(shè)置類,以動畫 joyfulButton 慶祝正確答案 */
        e.target.classList.add("rightAnswer");
        /* 將 rightAnswer on question 設(shè)置為 true,計(jì)算屬性可以跟蹤連續(xù) 20 個問題 */
        this.questions[index].rightAnswer = true;
      } 別的 {
        /* 將用戶的回答標(biāo)記為錯誤答案 */
        e.target.classList.add("wrongAnswer");
        this.questions[index].rightAnswer = false;
        /* 顯示正確答案 */
        讓 correctAnswer = this.questions[index].correct_answer;
        讓 allButtons = document.querySelectorAll(`[index="${index}"]`);
        allButtons.forEach(函數(shù)(按鈕){
          如果(按鈕。innerHTML === correctAnswer){
            button.classList.add("showRightAnswer");
          }
        });
      }
    }
  },

運(yùn)行服務(wù)器

運(yùn)行服務(wù)器后,點(diǎn)擊瀏覽器,您的用戶界面將如下所示


點(diǎn)擊答案你會知道你的答案是否正確,同時顯示下一個問題。在測驗(yàn)結(jié)束時,您將獲得顯示正確答案的計(jì)分板。

Github 存儲庫:VueJS 測驗(yàn)應(yīng)用程序

請隨意訪問 github 源代碼:VueJS Quiz App并克隆存儲庫以使用代碼。

結(jié)論

所以,這是關(guān)于如何使用 VueJS 開發(fā)前端測驗(yàn)應(yīng)用程序。您是 VueJS 的熱衷學(xué)習(xí)者嗎?如果是,那么VueJS 教程頁面適合您!訪問不同的教程并開始深入學(xué)習(xí)高級 VueJS 知識,或者也完善您的 VueJS 基礎(chǔ)知識。

言鼎科技主做軟件開發(fā),微信小程序,網(wǎng)站開發(fā),軟件外包,手機(jī)APP開發(fā)。如有需要記得聯(lián)系我們!

The End