useEffect的回调函数的return语句何时执行?
useEffect的回调函数的return语句何时执行?
我想澄清一下我对这里发生的事情的理解。欢迎提供任何细节来改善我的理解。
function Timer() { let [time, setTime] = useState(5); useEffect(() => { let timer = setInterval(() => { setTime(time - 1); }, 1000) return () => clearInterval(timer); }, ); return {time} } export default Timer
[https://codesandbox.io/s/cranky-chaplygin-g1r0p](https://codesandbox.io/s/cranky-chaplygin-g1r0p)
- 将`time`初始化为`5`。
- 读取`useEffect`,它的回调函数将在稍后执行。
- 渲染`div`。
- 执行`useEffect`的回调函数。设置`setInterval`的回调函数准备触发。当然,此时`useEffect`的`return`语句不会执行,因为如果执行了,将会取消定时器(而定时器确实在工作)。
- 大约1秒后,`setInterval`的回调函数触发,改变`time`的状态(变为4)。
- 现在,某个状态已经改变,函数被重新执行。将新的时间状态初始化为新的变量`time`。
- 读取新的`useEffect`,它的回调函数将在稍后执行(这是因为`useEffect()`没有第二个参数)。
- 执行组件函数的`return`语句。这实际上重新渲染了`div`。
- 在某个时间点,之前的`useEffect`的`return`语句执行(这会禁用之前的`useEffect`中的定时器)。我不确定这是何时发生的。
- 执行“新”的`useEffect`的回调函数。