1

我正在使用 PrimeReact 进度条,并希望在页面加载时动态更新它。我的代码如下 -

const IntroPage = () => {
  const [progressBarValue, setProgressBarValue] = useState(0)
  useEffect(() => {
    setInterval(function() {
      let val = progressBarValue;
      val += Math.floor(Math.random() * 10) + 5;

      if (val >= 100) {
        val = 100;
      }

      setProgressBarValue(val)
    }, 1000);
  }, [])

  return (
    <div className='main-container'>
      <div></div>
      <div className='progress-bar-container'>
        <ProgressBar className='progress-bar' value={progressBarValue}></ProgressBar>
      </div>
      <div></div>
    </div>
    )
}

出于某种原因,当我加载页面时,进度条不会连续增加 100,它来回移动,我不太确定为什么会发生这种情况。所以它会达到 8% 或 10%,然后下降到 6,等等。我认为问题是每次设置新状态时,它都不会添加到先前设置的状态之上。任何帮助,将不胜感激。

更新:我也尝试将 setInterval 放在一个单独的函数中并调用它,但这也做同样的事情 -

 useEffect(() => {
             loadProgressBar() 
        }  
    }, [])

 function loadProgressBar() {
        setInterval(function(){ 
            let val = progressBarValue;
            val += Math.floor(Math.random() * 10) + 5;

            if (val >= 100) {
                val = 100;
                clearInterval();
            }

            setProgressBarValue(val)
        }, 1000);
    }

4

1 回答 1

1

这不是在 useEffect 中使用区间函数的正确方法,您可以在此处阅读更多信息

正确的做法是这样的:

useEffect(() => {
    const intervalId = setInterval(() => {
      setProgressBarValue((prev) => {
        if (prev >= 100) {
          clearInterval(intervalId);
          return 100;
        } else {
          return prev + 5;
        }
      });
    }, 1000);
    return () => clearInterval(intervalId);
  }, []);

现场演示

您的实现的问题是progressBarValueuseEffect 内部没有更新。
的回调setInterval编译一次,然后每 1000 毫秒运行一次(函数及其参数的相同值/引用),因为依赖数组为空。
这意味着,它读取 的初始值progressBarValue并且不读取简单的下一个值,因为它不是 useEffect 的依赖项。

在我的实现中,setProgressBarValue()使用回调来读取状态的先前值并增加它。

于 2020-10-13T18:26:18.740 回答