React hooks 踩坑

74 阅读1分钟

1、hooks组件中清除定时器

let timer: any = null;
timer = setInterval(() => {
//todo
}, 1000);
clearInterval(timer);

此时是无法清除定时器的。 我们打印timer查找原因,此时timer是为null,那么可以确定timer并没有被赋值,或因为赋值后被re-render了, 因此无法获取到timer的值。

废话说完,我们来说解决办法:使用useRef来解决这个问题

const timer = useRef<any>(null);
timer = setInterval(() => {
//todo
}, 1000);
clearInterval(timer);

分析:

1、useRef 返回的是一个可变的对象,该对象只有个current属性,初始值为传入的参数(initialValue);

2、返回的ref对象在组件的整个生命周期内保持不变;

3、当更新current值时,并不会re-render(重新渲染),这是与useState不同的地方;

4、更新useRef是side effect(副作用),所以一般写在useEffect或event handler里;

5、useRef类似于组件的this;

扩展:

如果我们定义的变量是不需要重新渲染页面的,可以使用useRef来操作,如果需要重新渲染页面的,还是使用useState来操作变量并重新渲染页面。

欢迎大家相互分享在开发过程中踩的坑,说一下自己对这个坑的理解和解决办法,一起进步。