老师,这里为什么不清空定时器就会变乱,添加了返回清空定时器的回调就正常了呢?

来源:3-6 useEffect语法讲解(模拟生命周期以及自定义Hook)

CoderVi

2023-06-07

写回答

3回答

河畔一角

2023-06-07

定时器里面的状态发生变化时,会重复创建定时器,添加清空以后能够保证内存不会遗漏,同时引用一致性。

1
0

CoderVi

提问者

2023-06-07

我明白了,这里老师说的变乱就是每次+2。这是因为React严格模式下useEffect被调用了两次导致的,添加了清除定时器的回调函数之后会把第一次的定时器给清除掉。useEffect会在组件渲染后执行,而且每次组件重新渲染时,都会先运行上一次useEffect中返回的清理函数,然后再执行新的useEffect。当组件卸载时,执行最后一次返回的清理函数,清除最后一次设定的定时器。




0
3
皮小西
非常感谢!
2023-06-12
共3条回复

河畔一角

2023-06-07

闭包的作用,清空的回调方法形成闭包对定时器有引用。不添加清空,定时器下一次进来获取的count不是最新的,因为可能没有更新,引用以后,能保证每次进来count都是最新的。

0
1
CoderVi
老师我说一下我的理解: 首先视频里说的变乱就是每次+2。这是因为React严格模式下useEffect被调用了两次导致的,添加了清除定时器的回调函数之后会把第一次的定时器给清除掉。 这里涉及到的基础问题是useEffect的执行方式:useEffect会在组件渲染后执行,而且每次组件重新渲染时,都会先运行上一次useEffect中返回的清理函数,然后再执行新的useEffect。当组件卸载时,执行最后一次返回的清理函数,清除最后一次设定的定时器。 其次是闭包的问题: 定时器创建的内部函数是一个闭包,这里的count是创建之初的初始值0,并不是一个传进来的变量,如果不采用函数式更新,setCount每次取到的都是闭包里的count=0,所以count会一直等于0。而在setCount方法中采用函数式更新的时候,使用useState创建的更新函数会自动去获取对应setCount方法的count变量的最新值。
2023-06-07
共1条回复

React18+TS 通用后台管理系统解决方案落地实战

全面提升React高阶技能,灵活驾驭各类后台管理系统开发痛点

624 学习 · 226 问题

查看课程