javascript - useEffect 的回调的 return 语句什么时候执行?
问题描述
我想澄清一下我对这里发生的事情的理解。任何能提高我目前理解的细节都将不胜感激。
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/craky-chaplygin-g1r0p
time
正在初始化为5
。useEffect
被读取。它的回调必须准备好稍后触发。- 被
div
渲染。 useEffect
的回调被执行。setInterval
的回调准备触发。SurelyuseEffect
的return
语句不会在这里触发,因为如果触发它会取消计时器(并且计时器确实有效)。- 大约 1 秒后,
setInterval
的回调触发将time
(to 4) 的状态更改。 - 现在一个状态已经改变,函数被重新执行。
time
,一个新变量,被初始化为新的时间状态。 - 读取一个新
useEffect
的,它的回调准备好稍后触发。(发生这种情况是因为没有 的第二个参数useEffect()
)。 - 组件函数的
return
语句被执行。这有效地重新渲染了div
. - 在某些时候,执行 previous
useEffect
的return
语句(这会禁用该timer
previous 中的useEffect
)。我不确定何时会发生这种情况。 - 'new'
useEffect
的回调被执行。
解决方案
功能组件在其状态更改后是否“卸载”,这是否会导致先前的 useEffect 回调返回语句执行?
不,组件在其生命周期结束时只卸载一次,React 允许useEffect
通过提供一个带有return
语句的空 dep 数组来使用钩子执行回调:
useEffect(() => {
return () => {
console.log("unmounts");
};
}, []);
组件何时卸载?
当它的父级停止渲染它时。请参阅条件渲染。
您能否帮助我理解,一般而言或在我的问题中的示例中,useEffect 的 return 语句何时执行?
取决于 dep 数组:
- 如果它是空的
[]
,则卸载。 - 如果它有依赖关系
[value1,value2]
,则依赖关系发生变化(浅比较)。 - 如果它没有依赖项(没有第二个参数
useEffect
),它会在每个渲染上运行。
深入查看后续问题useEffect / useEffect?
推荐阅读
- variables - _ 在变量名谷歌应用程序脚本中?
- angular - Docker 容器启动 monorepo 应用程序很慢
- stm32 - STM32 BluePill LED 闪光灯使用 HAL_GPIO_TogglePin 表现异常
- python - PySpark Sql 列名中包含破折号/连字符
- android - 画布绘制位图在 Android 10 上崩溃,但在 Android 8 上没有
- python-3.x - 如何使用熊猫在数据框中添加一个空列(不指定列名)?
- c++ - 如果评估,为什么 constexpr 中的代码无法访问?
- python - python中的分支故事。- 我的代码有什么问题?
- vue.js - defaultProtocol 不适用于带有 ckeditor5-vue 的链接
- python - 正则表达式:将“空白”字符和 - 字符更改为 null