# React技巧之用钩子clearTimeout
原文链接:https://bobbyhadz.com/blog/react-cleartimeout (opens new window)
作者:Borislav Hadzhiev (opens new window)
正文从这开始~
# 总览
要在React中用钩子清除一个超时或间隔:
- 使用
useEffect
钩子设置一个setTimeout
或者setInterval
。 - 从
useEffect
钩子中返回一个函数。 - 在组件卸载时,使用
clearTimeout()
或者clearInterval()
方法来移除定时器。
// App.js
import {useEffect, useState} from 'react';
export default function App() {
const [isShown, setIsShown] = useState(false);
useEffect(() => {
const timeoutID = setTimeout(() => {
setIsShown(true);
}, 1000);
return () => {
// 👇️ clear timeout when component unmounts
clearTimeout(timeoutID);
};
}, []);
return (
<div>
{isShown ? (
<div>
<h2>isShown = true</h2>
</div>
) : (
<div>
<h2>isShown = false</h2>
</div>
)}
</div>
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# clearTimeout
如果你需要清理间隔,请往下翻到下一节。
我们给useEffect
钩子传递空的依赖数组,因为我们只需要当组件挂载时,注册定时器一次。
需要注意的是,你可以在相同的组件中多次调用
useEffect
钩子。
我们在useEffect
钩子中使用setTimeout()
方法,但是我们必须确保清除定时器,防止内存泄漏。举例来说,如果组件在定时器到期前卸载,而我们没有清除定时器,我们就会有一个内存泄漏。
当组件卸载时,我们从useEffect
钩子返回的函数会被调用。
// App.js
useEffect(() => {
const timer = setTimeout(() => {
setIsShown(true);
}, 1000);
// 👇️ runs when component unmounts
return () => {
clearTimeout(timer);
};
}, []);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
我们使用clearTimeout
方法来取消之前注册的定时器。如果组件在延迟结束前卸载,clearTimeout
方法会运行并取消定时器。
# clearInterval
同样的,我们可以使用clearInterval
方法取消间隔,使用setInterval
注册间隔。
// App.js
import {useEffect, useState} from 'react';
export default function App() {
const [count, setCount] = useState(0);
useEffect(() => {
const intervalID = setInterval(() => {
setCount(prev => prev + 1);
}, 1000);
// 👇️ cancel interval when component unmounts
return () => {
clearInterval(intervalID);
};
}, []);
return (
<div>
<h2>Count: {count}</h2>
</div>
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
当组件卸载时,我们运行clearInterval
方法来取消先前注册的间隔。
# 总结
清理步骤很重要,因为我们要确保我们的应用程序中没有任何内存泄漏。