javascript 在react / typescript应用程序中设置间隔:包括状态依赖项会导致其停止运行

hrirmatl  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(92)

在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”方式是什么?

f87krz0w

f87krz0w1#

useEffect的返回函数中,不设置

intervalref.current = null;

因此,当useEffect的cleanup函数被触发时,您停止了间隔,但在所有条件下,您永远不会启动新的间隔。
与您的问题无关,但是check_balance最好是useRef而不是状态,因此您的useCallbackuseEffect不会再次触发

相关问题