網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
如何使 React 中的 useEffect、useLayoutEffect 只調(diào)用一次
??Hook 是 React 16.8 的新增特性,旨在替代原來(lái) React 中的 Class 組件。React 官方已經(jīng)對(duì)使用 Class 組件采取了負(fù)面態(tài)度(見(jiàn)此處)。雖然目前官方仍然明確聲明“沒(méi)有計(jì)劃從 React 中移除 class
”(見(jiàn)此處),但待 Hook 成熟之后,Class 組件語(yǔ)法被廢棄恐怕是遲早的事情。
??useEffect
、useLayoutEffect
可用于替代 Class 組件生命周期的方法。通常,它們都會(huì)反復(fù)執(zhí)行。有時(shí)候,這會(huì)導(dǎo)致死循環(huán)。
??使 useEffect
、useLayoutEffect
只調(diào)用一次的方法是,向它們傳入第二個(gè)空數(shù)組參數(shù)。如:
useEffect(() => init(), []);
【踩坑提醒】
??不要使用如下途徑來(lái)使 useEffect
、useLayoutEffect
只調(diào)用一次。
let didInit = false;
useEffect(() => {
if (!didInit) {
didInit = true; // didInit 放在哪里都不會(huì)起作用
init();
didInit = true; // didInit 放在哪里都不會(huì)起作用
}
});
??有過(guò)多線程并發(fā)編程經(jīng)驗(yàn)的人應(yīng)該知道,上面的 didInit
將不起作用,且程序可能將在初始化時(shí)陷入死循環(huán)。雖然客戶(hù)端 JavaScript 是單線程的,但由于 JavaScript 有異步語(yǔ)法,上述代碼仍然會(huì)造成對(duì) didInit 的異步并發(fā)訪問(wèn),導(dǎo)致 didInit
不起作用。由于 useEffect 可以被反復(fù)觸發(fā),如果上述的函數(shù) init()
進(jìn)行了對(duì) state 的異步更新,這將導(dǎo)致對(duì) useEffect 的持續(xù)循環(huán)觸發(fā)。
??由于 JavaScript 不支持多線程鎖,所以它無(wú)法使用 雙重檢查鎖定
。因此,在 React 中,不要自作聰明編寫(xiě)這種壞代碼。
??如果想知道更多關(guān)于從 Class 組件到 Hook 的重構(gòu)方法,可見(jiàn):https://react.docschina.org/docs/hooks-faq.html#from-classes-to-hooks
原文鏈接:https://blog.csdn.net/wangpaiblog/article/details/123304632
相關(guān)推薦
- 2022-09-04 Go語(yǔ)言簡(jiǎn)介和環(huán)境配置_Golang
- 2023-05-09 Python實(shí)現(xiàn)刪除重復(fù)文件的示例代碼_python
- 2022-12-10 Flutter?狀態(tài)管理scoped?model源碼解讀_Android
- 2022-03-15 ./configure: error: the HTTP rewrite module requir
- 2023-01-26 Redis中的慢日志_Redis
- 2023-03-21 通俗易懂的C語(yǔ)言快速排序和歸并排序的時(shí)間復(fù)雜度分析_C 語(yǔ)言
- 2022-08-13 服務(wù)器上Redis主從復(fù)制和哨兵機(jī)制的配置
- 2022-03-26 C++約瑟夫環(huán)問(wèn)題詳解_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支