React 组件中无法清除定时器问题记录

React 组件中无法清除定时器问题记录

需求

关闭弹窗时,需要把页面透传到组件中的定时器清除掉

问题发现

部分代码

js 复制代码
const serviceModal: FC = () => {
	// xxxx 一些操作
	let timeoutTimer: any = null
	timeoutTimer = setTimeout(() => {}, 3000)

	// xxxx 一些操作
	clearTimeout(timeoutTimer)
}

clearTimeout发现清除不掉,就在清除定时器的前后分别打印了一下timer,发现log出来的全都是undefined。

网上查询之后了解到:清除定时器,定时器的标识会在一瞬间变为 undefined , 但立马就会又重新开始执行定时器,而且定时器标识不变。所以无法清除定时器

原因

函数组件的本质是一个函数,而在在一个局部函数中,函数每一次执行,都会在把函数的变量重新生成一次。

本次解决方案

将定时器变量定义在函数组件外部(全局)

js 复制代码
let timeoutTimer: any = null
const serviceModal: FC = () => {
	// xxxx 一些操作
	timeoutTimer = setTimeout(() => {}, 3000)

	// xxxx 一些操作
	clearTimeout(timeoutTimer)
}

其他解决方案

可将定时器放入state中,感兴趣的可以自己测试下

相关推荐
u01030552717 小时前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u0103055271 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节
u0103055272 天前
使用BufferedReader读取控制台输入
人工智能·1024程序员节
u0103055273 天前
泛型类与类型安全详解
人工智能·1024程序员节
u0103055275 天前
Java异常处理核心机制
人工智能·1024程序员节
炽天使32812 天前
Knife4j 4.5.0 + Spring Boot 3.4.11 版本兼容问题解决方案
1024程序员节
liguojun202515 天前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
liguojun202524 天前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
开开心心就好2 个月前
解决截图被拦截黑屏问题的免费小工具
安全·智能手机·flink·kafka·pdf·音视频·1024程序员节