首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1构建Product Hunt项目
1.2设置开发环境
1.3针对Windows用户的特殊说明
1.4JavaScript ES6/ES7
1.5什么是组件
1.6构建Product组件
1.7让数据驱动Product组件
1.8应用程序的第 一次交互:投票事件响应
1.9更新state和不变性
1.10用Babel插件重构transform-class-properties
2.1计时器应用程序
2.2开始计时器应用程序
2.3将应用程序分解为组件
2.4从头开始构建React应用程序的步骤
2.5第(2)步:构建应用程序的静态版本
2.6第(3)步:确定哪些组件应该是有状态的
2.7第(4)步:确定每个state 应该位于哪个组件中
2.8第(5)步:通过硬编码来初始化state
2.9第(6)步:添加反向数据流
2.10更新计时器
2.11删除计时器
2.12添加计时功能
2.13添加启动和停止功能
3.1组件和服务器介绍
3.2server.js
3.3服务器API
3.4使用API
3.5从服务器加载状态
3.6client
3.7向服务器发送开始和停止请求
3.8向服务器发送创建、更新和删除请求
3.9下一步
4.1React使用了虚拟DOM
4.2为什么不修改实际的DOM
4.3什么是虚拟DOM
4.4虚拟DOM片段
4.5ReactElement
4.6JSX
5.1props、state和children介绍
5.2如何使用本章
5.3ReactComponent
5.4props是参数
5.5PropTypes
5.6使用getDefaultProps()获取默认props
5.7上下文
5.8state
5.9无状态组件
5.10使用props.children与子组件对话
6.1表单101
6.2文本输入
6.3远程数据
6.4异步持久性
6.5Redux
6.6表单模块
7.1JavaScript模块
7.2Create React App
7.3探索Create React App
7.4Webpack基础
7.5对示例应用程序进行修改
7.6创建生产构建
7.7弹出
7.8Create React App和API服务器一起使用
7.9Webpack总结
8.1不使用框架编写测试
8.2Jest是什么
8.3使用Jest
8.4React应用程序的测试策略
8.5使用Enzyme测试基本的React组件
8.6为食物查找应用程序编写测试
8.7编写FoodSearch.test.js
当前位置:
首页>>
技术小册>>
React全家桶--前端开发与实例(上)
小册名称:React全家桶--前端开发与实例(上)
### 2.1 计时器应用程序 在React全家桶的广阔天地中,构建一个计时器应用程序不仅是一个基础的实践项目,也是深入理解React状态管理、事件处理以及组件化思想的绝佳机会。本章节将引导你从头开始设计一个简单而功能完备的计时器应用,涵盖React的基础知识、Hooks的使用、以及组件间的通信。 #### 2.1.1 项目概述 计时器应用程序旨在提供一个界面,允许用户启动、暂停和重置计时。界面应包含显示当前时间的元素(如小时、分钟、秒),以及控制按钮(启动、暂停、重置)。通过这个项目,我们将学习到React的核心概念,如组件化、状态提升、以及Hooks等。 #### 2.1.2 初始化项目 首先,确保你已经安装了Node.js和npm/yarn。接着,我们将使用Create React App来快速搭建项目框架: ```bash npx create-react-app timer-app cd timer-app npm start ``` 这将创建一个新的React项目并启动开发服务器。现在,你可以在浏览器中看到默认的React应用界面。 #### 2.1.3 设计组件结构 对于计时器应用,我们可以将其拆分为几个组件: - **`App`组件**:作为根组件,管理全局状态,如计时器是否运行、当前时间等。 - **`TimerDisplay`组件**:用于显示当前时间(小时:分钟:秒)。 - **`ControlPanel`组件**:包含启动、暂停、重置按钮,处理用户交互。 #### 2.1.4 实现`TimerDisplay`组件 `TimerDisplay`组件将接收从父组件传递的时间状态,并渲染到界面上。由于时间数据是动态变化的,我们将使用props来接收这些数据。 ```jsx // TimerDisplay.js import React from 'react'; function TimerDisplay({ hours, minutes, seconds }) { return ( <div> <p>{hours}:{minutes.toString().padStart(2, '0')}:{seconds.toString().padStart(2, '0')}</p> </div> ); } export default TimerDisplay; ``` 这里使用了`toString().padStart(2, '0')`来确保分钟和秒数始终是两位数。 #### 2.1.5 实现`ControlPanel`组件 `ControlPanel`组件将包含三个按钮,每个按钮触发不同的函数来处理计时器的状态变化。由于这些函数需要修改父组件的状态,我们将使用回调函数作为props传递给`ControlPanel`。 ```jsx // ControlPanel.js import React from 'react'; function ControlPanel({ startTimer, pauseTimer, resetTimer }) { return ( <div> <button onClick={startTimer}>Start</button> <button onClick={pauseTimer}>Pause</button> <button onClick={resetTimer}>Reset</button> </div> ); } export default ControlPanel; ``` #### 2.1.6 使用Hooks管理状态 在`App`组件中,我们将使用`useState`和`useEffect` Hooks来管理计时器的状态和时间更新。`useState`用于维护时间(小时、分钟、秒)和计时器状态(是否正在运行),而`useEffect`则用于处理计时逻辑。 ```jsx // App.js import React, { useState, useEffect } from 'react'; import TimerDisplay from './TimerDisplay'; import ControlPanel from './ControlPanel'; function App() { const [time, setTime] = useState({ hours: 0, minutes: 0, seconds: 0 }); const [isRunning, setIsRunning] = useState(false); useEffect(() => { let interval = null; if (isRunning) { interval = setInterval(() => { setTime(prevTime => ({ ...prevTime, seconds: prevTime.seconds + 1, minutes: Math.floor((prevTime.minutes + prevTime.seconds / 60) % 60), hours: Math.floor((prevTime.hours + prevTime.minutes / 60) % 24) })); }, 1000); } else if (interval) { clearInterval(interval); } return () => clearInterval(interval); }, [isRunning]); const startTimer = () => setIsRunning(true); const pauseTimer = () => setIsRunning(false); const resetTimer = () => setTime({ hours: 0, minutes: 0, seconds: 0 }); return ( <div> <TimerDisplay {...time} /> <ControlPanel startTimer={startTimer} pauseTimer={pauseTimer} resetTimer={resetTimer} /> </div> ); } export default App; ``` 在这个例子中,`useEffect`的依赖项数组`[isRunning]`确保了当`isRunning`状态改变时,`useEffect`会重新运行。我们使用`setInterval`来每秒更新时间,当计时器停止时,使用`clearInterval`来清除定时器。 #### 2.1.7 进一步优化与测试 - **性能优化**:考虑在组件卸载时清理定时器,防止内存泄漏。这已在上述代码中通过`useEffect`的清理函数实现。 - **UI/UX**:为了提升用户体验,可以添加动画效果或更友好的用户反馈,如点击按钮时的禁用状态。 - **测试**:使用Jest和React Testing Library编写单元测试,确保每个功能按预期工作。 - **可访问性**:确保应用对所有用户都友好,包括那些使用屏幕阅读器的用户。 #### 2.1.8 总结 通过构建这个计时器应用程序,我们不仅掌握了React的基本概念和Hooks的使用,还深入理解了组件间的通信和状态管理。这个简单的项目为更复杂的React应用打下了坚实的基础,展示了React在前端开发中的强大能力和灵活性。随着你继续学习React全家桶的其他部分(如Redux、React Router等),你将能够构建出功能更加丰富、用户体验更加出色的Web应用。
上一篇:
1.10用Babel插件重构transform-class-properties
下一篇:
2.2开始计时器应用程序
该分类下的相关小册推荐:
剑指Reactjs
深入学习React实战进阶
React全家桶--前端开发与实例(下)
React 进阶实践指南
ReactJS面试指南