首页
技术小册
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.12 添加计时功能 在React项目中添加计时功能是一种常见的需求,无论是实现一个简单的倒计时器、计时器,还是创建基于时间的动画效果,都能极大地丰富应用的交互性和用户体验。本章节将详细介绍如何在React应用中集成计时功能,包括使用`setInterval`、`setTimeout`方法以及React的状态管理(如`useState`和`useEffect`钩子)来构建动态、响应式的计时器组件。 #### 2.12.1 理解计时器基本概念 在深入探讨React中的计时功能之前,先简要回顾一下JavaScript中的`setInterval`和`setTimeout`方法。 - **`setTimeout(function, delay)`**:该方法用于在指定的延迟时间后执行一次函数。它返回一个定时器ID,可以通过`clearTimeout(id)`来取消定时器。 - **`setInterval(function, interval)`**:该方法用于每隔指定的时间间隔重复执行一次函数。它同样返回一个定时器ID,通过`clearInterval(id)`来停止重复执行。 在React中,由于组件的生命周期和状态管理,直接在这些生命周期方法中使用`setTimeout`或`setInterval`可能会导致内存泄漏或组件状态不同步的问题。因此,我们需要更加谨慎地管理这些定时器。 #### 2.12.2 使用`useState`和`useEffect`构建计时器 React Hooks(如`useState`和`useEffect`)为我们在函数组件中处理状态和副作用提供了强大的工具。接下来,我们将通过一个简单的倒计时器示例来展示如何使用这些Hooks来构建计时功能。 ##### 示例:构建一个简单的倒计时器 假设我们需要一个倒计时器,从设定的时间(如10秒)开始递减,直到0为止。 1. **初始化状态**: 使用`useState`来管理当前剩余时间。 ```jsx import React, { useState, useEffect } from 'react'; function CountdownTimer({ duration }) { const [timeLeft, setTimeLeft] = useState(duration); // 后续代码... } export default CountdownTimer; ``` 2. **设置定时器**: 在组件挂载时,使用`useEffect`来设置定时器,并在组件卸载时清除定时器,以避免内存泄漏。 ```jsx useEffect(() => { const timer = setInterval(() => { // 如果时间未到0,则递减 if (timeLeft > 0) { setTimeLeft(timeLeft - 1); } else { // 时间到0时,停止定时器 clearInterval(timer); } }, 1000); // 每隔1000毫秒(1秒)执行一次 // 清理函数,确保组件卸载时定时器被清除 return () => clearInterval(timer); }, [timeLeft]); // 依赖项数组中包含timeLeft,确保时间变化时重新设置定时器 ``` 注意:这里将`timeLeft`作为`useEffect`的依赖项之一,虽然在这个特定示例中可能看起来有些多余(因为我们总是希望定时器持续运行直到时间耗尽),但在更复杂的场景中(比如基于外部条件动态调整计时间隔或重置计时器),这样做是必要的。 3. **展示时间**: 将剩余时间转换为更易读的格式,并在UI中展示。 ```jsx return ( <div> <p>剩余时间:{Math.floor(timeLeft / 60)}:{String(timeLeft % 60).padStart(2, '0')}</p> </div> ); ``` 这里使用了简单的字符串处理和`padStart`方法来格式化时间(分钟:秒)。 #### 2.12.3 进阶:控制计时器的开始与停止 在实际应用中,我们可能还需要控制计时器的开始、暂停和重置功能。这可以通过引入额外的状态变量和逻辑来实现。 - **添加控制状态**: 使用`useState`来管理计时器的状态(如`isRunning`表示计时器是否正在运行)。 - **更新逻辑**: 在`useEffect`中根据`isRunning`的状态来决定是否启动或停止定时器。同时,提供按钮或函数来更新这个状态。 - **UI交互**: 在组件的JSX部分添加按钮,用于启动、暂停和重置计时器。 #### 2.12.4 注意事项与最佳实践 - **避免在`useEffect`的依赖项中错误地包含状态变量**:这可能导致不必要的重渲染和定时器重置。 - **确保清理函数正确执行**:在组件卸载时清除定时器,避免内存泄漏。 - **处理时间精度**:JavaScript中的`setInterval`并不总是精确执行,特别是在执行复杂任务或浏览器标签页处于非活动状态时。考虑使用`requestAnimationFrame`或`setTimeout`递归调用来实现更平滑的动画效果。 - **使用`useRef`管理定时器ID**:在需要跨多个`useEffect`调用或组件生命周期中持续引用定时器ID时,使用`useRef`而不是在组件状态或`useEffect`的清理函数中直接存储ID。 #### 2.12.5 结论 通过本章节的学习,你应该能够掌握在React应用中添加计时功能的基本方法,包括使用`useState`和`useEffect`Hooks来管理状态和副作用。我们还探讨了如何构建简单的倒计时器,并讨论了如何扩展功能以包含开始、暂停和重置操作。记住,在处理计时和动画时,始终要考虑性能优化和用户体验,确保你的应用既高效又易于使用。
上一篇:
2.11删除计时器
下一篇:
2.13添加启动和停止功能
该分类下的相关小册推荐:
剑指Reactjs
React全家桶--前端开发与实例(下)
React 进阶实践指南
深入学习React实战进阶
ReactJS面试指南