我想澄清我对这里发生的事情的理解。任何改善我目前理解的细节将不胜感激。
function Timer() {
let [time, setTime] = useState(5);
useEffect(() => {
let timer = setInterval(() => {
setTime(time - 1);
}, 1000)
return () => clearInterval(timer);
}, );
return <div>{time}</div>
}
export default Timer
https://codesandbox.io/s/cranky-chaplygin-g1r0p
time
正在初始化为5
.useEffect
已读。它的回调必须准备好稍后触发。- 该
div
呈现。 useEffect
的回调被执行。setInterval
的回调准备好触发。当然,这里不会触发useEffect
'sreturn
语句,因为如果触发它会取消计时器(并且计时器确实有效)。- 大约 1 秒后,
setInterval
的回调触发将time
( 到 4)的状态更改。 - 现在一个状态发生了变化,函数被重新执行。
time
,一个新变量,被初始化为新的时间状态。 useEffect
读取一个新的,它的回调准备稍后触发。(发生这种情况是因为没有 的第二个参数useEffect()
)。- 组件函数的
return
语句被执行。这有效地重新渲染了div
. - 在某些时候,前一个
useEffect
的return
语句会执行(这会禁用timer
前一个中的useEffect
)。我不确定什么时候会发生这种情况。 - 'new'
useEffect
的回调被执行。