首页
技术小册
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.11 删除计时器 在React应用中,处理计时器(Timers)是一个常见的需求,尤其是在需要实现倒计时、轮播图自动播放、或者任何需要定时执行任务的场景中。然而,随着组件的卸载或状态的改变,适时地删除(或清除)这些计时器变得尤为重要,以避免内存泄漏或执行不必要的操作。本章节将深入探讨在React中如何有效地删除计时器,包括使用`setTimeout`、`setInterval`以及React的生命周期方法(对于类组件)和Hooks(对于函数组件)的最佳实践。 #### 2.11.1 理解计时器与内存泄漏 在JavaScript中,`setTimeout`和`setInterval`是常用的全局函数,用于在指定的延迟后执行代码或每隔一定时间重复执行代码。然而,如果不对这些计时器进行适当的管理,它们可能会在组件卸载后继续运行,导致内存泄漏。内存泄漏是指程序占用的内存量持续增加,而没有被正确释放,最终可能导致应用性能下降或崩溃。 #### 2.11.2 类组件中的计时器管理 在React的类组件中,管理计时器通常涉及在组件的`componentDidMount`生命周期方法中设置计时器,并在`componentWillUnmount`生命周期方法中清除它。 ##### 示例:使用`setTimeout` ```jsx class TimerComponent extends React.Component { constructor(props) { super(props); this.timerID = null; // 用于存储计时器ID } componentDidMount() { // 设置一个5秒后执行的计时器 this.timerID = setTimeout(() => { console.log('Timer expired!'); // 这里可以执行一些操作,比如更新状态等 }, 5000); } componentWillUnmount() { // 组件卸载时清除计时器 if (this.timerID) { clearTimeout(this.timerID); } } render() { return <div>Check console for timer expiration.</div>; } } ``` ##### 示例:使用`setInterval` ```jsx class IntervalComponent extends React.Component { constructor(props) { super(props); this.intervalID = null; // 用于存储间隔计时器ID } componentDidMount() { // 每秒执行一次 this.intervalID = setInterval(() => { console.log('Interval tick!'); // 这里可以执行周期性任务 }, 1000); } componentWillUnmount() { // 组件卸载时清除间隔计时器 if (this.intervalID) { clearInterval(this.intervalID); } } render() { return <div>Check console for interval ticks.</div>; } } ``` #### 2.11.3 函数组件中的计时器管理 随着Hooks的引入,函数组件也能像类组件一样拥有状态和其他React特性。对于计时器的管理,我们可以使用`useEffect` Hook来实现。 ##### 示例:使用`setTimeout`和`useEffect` ```jsx import React, { useEffect } from 'react'; function TimerFunctionComponent() { useEffect(() => { let timerID = setTimeout(() => { console.log('Timer expired in function component!'); // 清理代码(如果有的话) }, 5000); // 返回一个清理函数 return () => { clearTimeout(timerID); }; }, []); // 空依赖数组表示这个effect只在组件挂载和卸载时运行 return <div>Check console for timer expiration in function component.</div>; } ``` ##### 示例:使用`setInterval`和`useEffect` ```jsx import React, { useEffect } from 'react'; function IntervalFunctionComponent() { useEffect(() => { let intervalID = setInterval(() => { console.log('Interval tick in function component!'); // 周期性任务 }, 1000); // 返回一个清理函数 return () => { clearInterval(intervalID); }; }, []); // 同样,空依赖数组 return <div>Check console for interval ticks in function component.</div>; } ``` #### 2.11.4 注意事项 - **清理函数的重要性**:在`useEffect`中返回一个清理函数是确保资源(如计时器)在组件卸载时得到正确释放的关键。 - **依赖数组**:`useEffect`的依赖数组决定了effect何时重新运行。对于只应在组件挂载和卸载时运行的计时器,应传递一个空数组作为依赖。 - **避免在渲染方法中设置计时器**:在组件的渲染方法(`render`或函数组件的返回语句)中设置计时器是不推荐的,因为这会导致每次渲染时都重新创建计时器,可能导致性能问题或不必要的重复执行。 - **条件计时器**:如果计时器的设置依赖于某些条件,可以将这些条件作为`useEffect`的依赖项,以便在条件变化时重新设置或清除计时器。 #### 2.11.5 结论 在React中有效地管理计时器是确保应用性能和稳定性的重要方面。无论是使用类组件还是函数组件,通过合理利用生命周期方法或Hooks,我们都能轻松实现计时器的设置与清理。记住,总是要在组件卸载时清除计时器,以避免内存泄漏和其他潜在问题。随着React和JavaScript的不断发展,最佳实践可能会发生变化,但基本原则——即及时清理不再需要的资源——将始终适用。
上一篇:
2.10更新计时器
下一篇:
2.12添加计时功能
该分类下的相关小册推荐:
React全家桶--前端开发与实例(下)
React 进阶实践指南
ReactJS面试指南
深入学习React实战进阶
剑指Reactjs