Vue是一款流行的JavaScript框架,可以帮助开发者创建丰富的Web应用程序。在本文中,我们将讨论如何使用Vue开发一个答题小程序。我们将使用Vue.js 2.x和Vuetify UI框架,使用Axios库进行HTTP请求。
基础设置
在开始开发之前,我们需要设置一个基础环境。为此,我们需要安装Node.js,npm和Vue CLI(如果还没有安装)。
步骤一:安装Vue CLI
打开终端并运行以下命令:
```npm install -g vue-cli```
步骤二:创建Vue项目
创建一个新的Vue项目:
```vue init webpack my-quiz-app```
其中,“my-quiz-app”是您所选择的项目名称,您可以根据自己的需要选择不同的名称。
步骤三:进入项目文件夹并安装依赖项
```cd my-quiz-app```
```npm install```
Vue组件
我们将创建以下组件:
- App.vue - 用于整个应用程序布局
- Home.vue - 用于展示开始页面和答题页面
- Quiz.vue - 用于展示问题和答案选项
- Results.vue - 用于展示最终结果页面
App.vue 组件
我们将在App.vue组件中定义程序架构。这将包括导航栏和路由用于导航到其他页面。 我们将使用Vuetify UI框架来设计应用程序的UI。
以下是App.vue的代码:
```html
export default {
}
```
在这个组件中,我们使用了一个Vuetify组件,名为v-app-bar。v-app-bar是一个可定制的栏,它可以显示应用程序标题和导航按钮。通过设置 color和dark属性,我们可以设置导航栏的风格。
v-btn组件用于创建两个导航页面的按钮。第一个按钮回到主页,第二个按钮导航到我们的答题页面。
使用router-view标记只需导航到其他页面即可在应用程序中呈现新页面。
Home.vue 组件
Home.vue组件将是我们的欢迎页面和题目开始的页面。在这里,我们将展示一些信息和路由到Quiz.vue组件。
以下是Home.vue的代码:
```html
This app is designed to test your knowledge on various topics.
export default {
}
```
Quiz.vue 组件
在Quiz.vue组件中,我们将使用Axios库进行HTTP请求来获取问题和答案选项。 当答案选项被选择时,我们将检测选择是否正确,并按正确或错误的方式提供正确的反馈。 在所有答案选项都选择后,我们将导航到“结果”页面。
以下是Quiz.vue的代码:
```html
import axios from "axios";
export default {
data() {
return {
quizData: [],
currentQuestionIndex: 0,
selectedAnswer: {},
correctAnswers: 0,
incorrectAnswers: 0
}
},
mounted() {
axios.get("https://opentdb.com/api.php?amount=10&type=multiple")
.then(response => {
this.quizData = response.data.results;
}).catch(error => {
console.log(error);
});
},
computed: {
question() {
return this.quizData[this.currentQuestionIndex]?.question;
},
shuffledAnswers() {
return this.shuffle(this.currentQuestion?.allAnswers || []).map(option => {
return {option, text: this.currentQuestion[option]};
});
},
currentQuestion() {
return this.quizData[this.currentQuestionIndex];
},
hasNextQuestion() {
return this.currentQuestionIndex < (this.quizData.length - 1);
},
hasPreviousQuestion() {
return this.currentQuestionIndex > 0;
}
},
methods: {
selectAnswer(answer) {
this.selectedAnswer = {text: this.currentQuestion[answer], selected: answer};
},
checkAnswer() {
return this.currentQuestion.correct_answer === this.selectedAnswer.selected;
},
nextQuestion() {
if (!this.selectedAnswer.selected) {
alert("Please select an answer before proceeding.");
return;
}
if (this.checkAnswer()) {
this.correctAnswers += 1;
} else {
this.incorrectAnswers += 1;
}
this.selectedAnswer = {};
this.currentQuestionIndex += 1;
if (!this.hasNextQuestion) {
this.$router.push({path: "/results", params: {correctAnswers: this.correctAnswers, incorrectAnswers: this.incorrectAnswers}});
}
},
previousQuestion() {
if (this.hasPreviousQuestion) {
this.currentQuestionIndex -= 1;
}
},
shuffle(array) {
[...array].forEach((value, index) => {
const randomIndex = Math.floor(Math.random() * array.length);
[array[index], array[randomIndex]] = [array[randomIndex], array[index]];
});
return array;
}
}
}
```
在这个组件中,我们定义了以下重要属性:
- quizData - 存储从API获取的问题和答案选项。
- currentQuestionIndex - 当前处理的问题的索引。
- selectedAnswer - 存储用户选择的答案选项。
- correctAnswers - 用于保存用户答对的总数。
- incorrectAnswers - 用于保存用户答错的总数。
在Mounted函数中,我们使用Axios库向API发出HTTP GET请求。然后在quizData数组中存储我们收到的问题和答案选项。
在计算属性中,我们可以看到:
- question函数返回当前问题的文本。
- shuffledAnswers使用Fisher-Yates算法随机打乱答案选项,并返回shuffle对象。
- currentQuestion函数返回当前处理的问题对象。
- hasNextQuestion和hasPreviousQuestion函数用于检查是否有下一问题或上一问题。
selectAnswer方法用于存储用户选择的答案选项。 checkAnswer方法用于检查用户选择的答案是否正确。
最后,nextQuestion方法用于导航到下一个问题或Results.vue组件。
Results.vue 组件
在Results.vue组件中,我们将显示答对和答错的问题的数量,并将提供一个“重新开始”按钮,以回到Home.vue组件。
以下是Results.vue的代码:
```html
export default {
props: ["correctAnswers", "incorrectAnswers"],
methods: {
resetQuiz() {
this.$router.push("/");
}
}
}
```
在这个组件中,我们使用的props将从路由实例中传递的“正确答案”和“错误答案”属性。这些属性在我们的Quiz.vue组件中被赋值。
resetQuiz方法将导航回Home.vue组件。
路由设置
现在我们已经定义了组件,我们需要设置路由。
打开src/router/index.js文件,并将代码替换为以下代码:
```js
import Vue from "vue";
import Router from "vue-router";
import Home from "@/components/Home.vue";
import Quiz from "@/components/Quiz.vue";
import Results from "@/components/Results.vue";
Vue.use(Router);
const router = new Router({
mode: "history",
routes: [
{path: "/", name: "home", component: Home},
{path: "/quiz", name: "quiz", component: Quiz},
{path: "/results", name: "results", component: Results, props: true}
]
});
export default router;
```
在这个文件中,我们定义了三个组件和路由。我们还使用了Vue Router的history模式,这意味着我们可以通过在网址中添加路由名称来导航