如何在反应中每5秒加1和setState

安德斯·基特森

我有一个useState变量,我想每5秒更新一次,增量为1,但是我希望它停止计数,并在达到数组长度时再次从0开始。这是我到目前为止所拥有的。现在,控制台日志令人困惑,它开始起作用,然后数字开始每秒或更快地输出一次。当我不在增量函数中运行SetShowNum时,此方法有效,但这是我需要的功能。

任何帮助将不胜感激。谢谢

const [showNum, SetShowNum] = useState(0)

  useEffect(() => {
    var i = 0

    var interval = setInterval(increment, 5000)

    var stop = data.allSanityProducts.edges.length // right now equates to 4

    function increment() {
      i = i + 1

      if (i === stop) {
        i = 0
      }

      console.log(i)
      SetShowNum(i)
    }
  })
CaliTab

在此解决方案中,我为useEffect添加了一个依赖项数组作为第二个参数。这样可以确保useEffect仅在首次安装组件时运行。否则,您编写的useEffect将在每次重新渲染时继续运行,因此这就是为什么您看到内存泄漏和所有日志语句的原因。我在useEffect中添加了日志语句以观察此行为。我建议在有和没有依赖项数组的情况下运行代码,以观察重新渲染的发生。

React文档:

“如果要运行一个效果并仅对其进行一次清理(在安装和卸载时),则可以传递一个空数组([])作为第二个参数。这告诉React您的效果不依赖于任何来自道具或状态,因此它永远不需要重新运行。这不是特殊情况-它直接取决于依赖项数组始终如何工作。”

const Component = () => {
  console.log("rerender");

  const [showNum, SetShowNum] = useState(0);
  
  useEffect(() => {
    console.log("running useEffect");
    var i = 0;

var interval = setInterval(increment, 5000);

// var stop = data.allSanityProducts.edges.length // right now equates to 4
const stop = 4;

function increment() {
  i = i + 1;

  if (i === stop) {
    i = 0;
  }

  console.log(i);
  SetShowNum(i);
}
  }, []);

  return (...)
};

链接到React useEffect文档:https ://reactjs.org/docs/hooks-effect.html

链接到codesandbox:https://codesandbox.io/s/nameless-sunset-1qyq4 file = / src / SO.js:0-590

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何每5秒查找一次linux中特定进程的内存消耗

如何在引导轮播中启用自动滑动功能,每10秒显示2张图像和1个视频?

如何在Python列表中合并每5个列表?

我如何每1秒运行一次setState函数

如何在amCharts中每5秒翻转一次切片?

每5秒如何执行存储过程?

如何在JavaScript中用秒加秒?

如何在反应5秒后自动关闭甜蜜警报

如何在Vue中循环嵌套数组并每5秒显示数据?

如何在React.js中每5秒生成一个随机数?

WPF DataGrid XML绑定和1列,每5秒更改一次状态

如何每5秒增加NSNumber的值?

如何在Android中每5秒更新进度对话框文本?

如何每5秒动态更改android中画布的颜色?

如何使用ajax和jquery每1秒检索一次php结果

Angular 2:如何在 Angular 2 中完成其他所有事情后每 5 秒在 while 循环中做某事?

如何在 jmeter 中每 5 秒发送 1 个请求

在不使用 Thread.sleep() 的情况下,如何在我的 run 方法中制作一个每 __ 秒生成 1 ____ 的生成器?

如何在每 1 秒重复 1 分钟后停止 setTimeout

如何在其他随机值中每 5 秒旋转一次对象?

如何在 GCP Cloud Scheduler 中每 10 秒运行一次

如何在角度反应形式控件中添加小数,其值从 1 和更大开始

如何在反应中显示每列的总和

如何在 useEffect 和 setState 中循环

Asyncio - 如何限制每 1 秒的请求?

如何在 api 中的每個請求上顯示加載圖標

如何在 Jetpack Compose 中每 5 秒調用一次函數

如何每 x 秒更改图像和背景颜色。反应

如何在 JavaScript 中为每 5 个单位编写?