在react应用程序中,我很难理解setInterval的正确用法,当我想拥有一个早期存在的选项(但保持间隔运行)时,该选项是应用程序中的某个状态。
我有下面的useEffect
:
useEffect(() => {
if (wallet.publicKey && intervalref.current === null) {
intervalref.current = window.setInterval(set_balance, 1000);
} else {
if (intervalref.current !== null) {
window.clearInterval(intervalref.current);
intervalref.current = null;
}
}
return () => {
if (intervalref.current !== null) {
window.clearInterval(intervalref.current);
}
};
}, [set_balance, wallet]);
这里的钱包来自第三方库,用于获取用户余额。
那么set_balance
就不是很复杂:
const set_balance = useCallback(async () => {
console.log("in increase", balance, check_balance);
if (wallet === null) return;
if (check_balance === false) return;
let current_balance = await get_current_balance(wallet);
if (current_balance !== balance) {
setCheckBalance(false);
}
setBalance(current_balance);
}, [wallet, balance, check_balance]);
接下来的想法是,该组件中的某个其他函数将执行setCheckBalance(true)
,然后上述函数将调用get_current_balance()运行,直到检测到更改,此时该函数将开始提前退出(但仍然运行)。
不幸的是,这不起作用。间隔只运行几次,然后停止。然而,如果我删除对balance和check_balance的依赖,并将它们替换为全局变量而不是state,它就起作用了。
不幸的是,这是一个非常有限的用例解决方案,因为我希望其他文件中的其他组件能够setCheckBalance,而它们不能设置导出的全局变量。
做这件事的“React”方式是什么?
1条答案
按热度按时间f87krz0w1#
在
useEffect
的返回函数中,不设置因此,当
useEffect
的cleanup函数被触发时,您停止了间隔,但在所有条件下,您永远不会启动新的间隔。与您的问题无关,但是
check_balance
最好是useRef
而不是状态,因此您的useCallback
和useEffect
不会再次触发