seTimeout()如何连续执行?

问题描述 投票:0回答:1

既然我们知道setTimeout()函数只执行一次,那么下面的程序如何连续执行:

import {useState} from "react"

const App = () => {

        const [counter, setcounter] = useState(0);

        setTimeout( () => setcounter (counter+1), 1000)
        

        return (
          <div>{counter} </div>
        )

}

export default App

请问有人能识别吗?哪段代码触发setTimeout()连续执行?

javascript reactjs settimeout
1个回答
1
投票

连续执行是由于每次使用setCounter更新状态时组件都会重新渲染。 当计数器发生变化时,React 会重新渲染组件,导致 setTimeout 再次通过一个新的回调来设置,该回调会增加计数器的值。 此循环无限期地继续,每个 setTimeout 调用都会触发另一个渲染,从而触发另一个 setTimeout。 这是直接在组件主体中将 React 的状态更新与 setTimeout 结合在一起而没有任何条件停止或控制执行的无意效果。

要在 React 组件中正确使用 setTimeout,您应该将其合并到 useEffect 挂钩中。这确保了计时器仅在组件安装时设置一次,并在组件卸载时清除,从而防止内存泄漏。这是一个例子:

import { useState, useEffect } from "react";

const App = () => {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    const timer = setTimeout(() => setCounter(counter + 1), 1000);
    return () => clearTimeout(timer); // Cleanup the timer on component unmount
  }, [counter]); // This effect runs whenever `counter` changes

  return <div>{counter}</div>;
};

export default App;

此代码通过在 useEffect 中设置超时来每秒递增计数器,每次计数器更改时都会重新触发。 清理功能可确保在组件卸载时清除计时器,从而避免潜在的资源使用问题。

© www.soinside.com 2019 - 2024. All rights reserved.