搜索

首页  >  问答  >  正文

setInterval 无限制重新渲染反应完整组件。为什么会发生这种情况以及如何解决?

这是我的反应代码。它使组件无限重新渲染:

const [seconds, setSeconds] = useState(60)
useEffect(() => {
    const interval = setInterval(() => {
        setSeconds(seconds => seconds - 1);
    }, 1000);
    return () => clearInterval(interval);
}, []);

console.log("object");

P粉978742405P粉978742405240 天前487

全部回复(1)我来回复

  • P粉476046165

    P粉4760461652024-04-04 14:48:25

    发生这种情况是因为您仅在组件卸载时清除间隔,这仅在用户离开页面时才会发生。

    也许这就是您所需要的?当间隔达到 0 时,我将清除它。但是为此我必须使用引用,我不能使用 setInterval 中的状态,因为它只有初始值:

    export default function App() {
      const [seconds, setSeconds] = useState(5);
      const secondsRef = useRef(seconds);
    
      useEffect(() => {
        const interval = setInterval(() => {
          if (secondsRef.current < 0) {
            clearInterval(interval);
          }
    
          secondsRef.current = secondsRef.current - 1;
          setSeconds((seconds) => seconds - 1);
        }, 1000);
        return () => clearInterval(interval);
      }, []);
    
      console.log("running", new Date());
    
      return 

    {seconds < 0 ? "Time is up!" : seconds}

    ; }

    回复
    0
  • 取消回复