我有一个重新发送代码按钮,按下后将禁用它30秒。这里是我的功能。
const time = useRef(30);
function disableResendBtn() {
time.current = 30;
setsendCodeBtnDisabled(true);
const interval = setInterval(() => {
(time.current = time.current - 1),
setsendCodeBtnText(i18n.t('RESEND') + '(' + time.current + ')'),
console.log(time.current);
}, 1000);
setTimeout(() => {
setsendCodeBtnDisabled(false);
setsendCodeBtnText(i18n.t('RESEND'));
clearInterval(interval);
}, 30000);
}
当我进入下一页时,我得到一个Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in %s.%s, a useEffect cleanup function
的错误。这个错误不是每次都显示。所以我不知道setInterval/setTimeout函数是否是原因。
无论如何,我如何才能使用useEffect来清理它呢?函数不在useEffect内部。
1条答案
按热度按时间xzv2uavs1#
您可以将
setInterval
和setTimeout
的返回值存储在一个ref中,然后创建一个空的useEffect
,它将为您清除这些值。我想到了一个更简单的方法。不用跟踪这些时间间隔和超时,然后使用空的
useEffect
进行清理,您可以创建一个useEffect
,它每秒更新当前时间。而且,为了跟踪禁用状态,您可以创建另一个状态,它跟踪“直到按钮应该被禁用的时间”。这样,
cleanup
就非常接近于实际的间隔定义。