React Hook useEffect 内部对“timeInterval”变量的赋值将在每次渲染后丢失

for*_*ort 1 javascript reactjs

我需要每 6 秒自动重新渲染一次,我定义了如下所示的组件。

const KioskPage = () => {

  const [time, setTime] = useState(Date.now())

  useEffect(() => {

    timeInterval = setInterval(() => setTime(Date.now()), 60000)

    return () => {
      clearInterval(timeInterval)
    }
  }, [])
}
Run Code Online (Sandbox Code Playgroud)

但我收到了通知:

每次渲染后,React Hook useEffect 内部对 'timeInterval' 变量的赋值将丢失。要随着时间的推移保留该值,请将其存储在 useRef Hook 中,并将可变值保留在 '.current' 属性中。否则,您可以直接在 useEffect react-hooks/exhaustive-deps 中移动此变量

为什么会发生这种情况?以及如何解决此问题?

问候

小智 5

每次渲染后,React Hook useEffect 内部对 'timeInterval' 变量的赋值将丢失。

为了显示:

const KioskPage = () => {

  const [time, setTime] = useState(Date.now())

  let timeInterval;
  // ^^^^^ this piece of code gets run on each render, when state/prop changes.
  // this will, in practice, clear the `timeInterval` value set by your effect below, when the component re-renders after being mounted.

  useEffect(() => {

    timeInterval = setInterval(() => setTime(Date.now()), 60000)
    // ^^^^ this assignment gets run once when the component mounts

    return () => {
      clearInterval(timeInterval)
    }
  }, []);
  
  return (/* render something*/);
}
Run Code Online (Sandbox Code Playgroud)

您可以按照建议通过“直接在 useEffect 中移动此变量”来解决此问题。

const KioskPage = () => {
  const [time, setTime] = useState(Date.now())

  useEffect(() => {
    const timeInterval = setInterval(() => setTime(Date.now()), 6000);
    // ^^^^^^^^^^^^^^^

    return () => {
      console.log('clearing!');
      clearInterval(timeInterval)
    }
  }, []);

  const formatted = new Date(time).toLocaleTimeString();
  return (
    <h1>Time: {formatted}</h1>
  );
}
Run Code Online (Sandbox Code Playgroud)