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)