如何使用 VueJS 開發(fā)前端測驗(yàn)應(yīng)用程序?
創(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)系我們!