react课程10-ReactQuiz(useReducer学习)
Last updated on August 29, 2024 pm
本节课做出了一个小小的测验应用,主要目的是为了了解useReducer这个hook的强大功能!
Auto Rename Tag插件,我为什么没有早点下载你!!!!!!😭😭😭
一、useReducer讲解
如何使用useReducer?(三步走)
- initialState
- reducer函数
- useReducer初定义状态(使用initialState)
二、json-server
JSON Server 是一个简单易用的工具,用于快速创建一个基于 JSON 文件的 RESTful API。它非常适合在开发和测试过程中使用,特别是在没有后端或后端未完成时,你可以使用 JSON Server 来模拟 API 进行前端开发。
JSON Server 的主要功能包括:
- 模拟 RESTful API: JSON Server 可以根据一个简单的 JSON 文件自动生成 RESTful API,包括 GET、POST、PUT、PATCH 和 DELETE 等常见的 HTTP 方法。
- 快速原型设计: 在开发过程中,你可以使用 JSON Server 快速创建一个 API,允许你专注于前端开发或 API 调用逻辑,而无需编写真实的后端代码。
- 处理查询参数: JSON Server 支持处理 URL 中的查询参数,允许你基于查询条件返回不同的数据集。
- 支持分页和排序: 它可以根据 URL 中的参数轻松实现数据的分页和排序。
- 支持完整的 CRUD 操作: 通过简单的配置,JSON Server 可以让你对 JSON 数据进行创建、读取、更新和删除操作。
在本次创建的应用中,我们有一个question.json,包含了一个questions数组,但是我们想要假装是通过一个(虚假的)API来获取到问题的内容,因此拆分了一下终端,npm i json-server
命令下载json-server,然后找到配置文件把命令加入,就可以运行npm run server
将question.json运行在指定的端口,访问(http://localhost:8001/questions)就可以获取questions数组。
"server": "json-server --watch data/questions.json --port 8001"
三、应用界面和代码
(1)主要界面
(2)要点
1、使用useReducer来批量集中地更新状态:由于reducer函数将状态的更新集中在一起,因此可以通过这个函数来得知所有状态的更新情况。除此之外,action.type的划分也可以很容易看到整个应用的多种状态。
2、状态列举:questions(问题数组)、status(应用状态:loading、error、ready、active、finished,对应界面的切换)、index(正在显示的问题坐标)、answer(用户的答案)、points(总分数)、highscore(最高分)、secondsRemaing(倒计时剩余时间)
3、如何使代码更具有可读性:将常量定义在函数体外而不是直接出现在某个js语句中;在构建APP的HTML时,尽量全部使用组件构建,不要出现冗余的的代码块;拆分组件的工作一定要做到位,例如本次应用中,拆分出了近十个小的组件,这样会使修改组件内容变得容易。
4、每个按钮的onClick函数!!在回答完最后一个问题之后,要进入finish界面了,如果不停止更新index就会报错。
5、当组件已然很多,可以把所有组件全部都放入components文件夹中了,但是此时要记得更新在index.js中导入App.js的时候路径问题。
6、不太会用reducer积累器(需要复习js基础知识)
(三)代码
1、index.css
1 |
|
2、App.js
1 |
|
3、Error.js
1 |
|
4、Loader.js
1 |
|
5、StartScreen.js
1 |
|
6、Header.js
1 |
|
7、Main.js
1 |
|
8、Progress.js
1 |
|
9、Questions.js
1 |
|
10、Options.js
1 |
|
11、Footer.js
1 |
|
12、Timer.js
1 |
|
setInterval
每隔 1000 毫秒(1秒)触发一次,向 dispatch
发送一个 { type: "tick" }
的动作,通常这个动作会在 reducer
中被处理为减少 secondsRemaining
的值,从而实现倒计时。clearInterval(id)
是清除定时器的操作,返回的函数会在组件卸载时或在 dispatch
发生变化时被调用,从而清除定时器,避免内存泄漏或不必要的计时操作。
13、NextButton.js
1 |
|
14、FinishScreen
1 |
|