網站首頁 編程語言 正文
如何使 React 中的 useEffect、useLayoutEffect 只調用一次
??Hook 是 React 16.8 的新增特性,旨在替代原來 React 中的 Class 組件。React 官方已經對使用 Class 組件采取了負面態度(見此處)。雖然目前官方仍然明確聲明“沒有計劃從 React 中移除 class
”(見此處),但待 Hook 成熟之后,Class 組件語法被廢棄恐怕是遲早的事情。
??useEffect
、useLayoutEffect
可用于替代 Class 組件生命周期的方法。通常,它們都會反復執行。有時候,這會導致死循環。
??使 useEffect
、useLayoutEffect
只調用一次的方法是,向它們傳入第二個空數組參數。如:
useEffect(() => init(), []);
【踩坑提醒】
??不要使用如下途徑來使 useEffect
、useLayoutEffect
只調用一次。
let didInit = false;
useEffect(() => {
if (!didInit) {
didInit = true; // didInit 放在哪里都不會起作用
init();
didInit = true; // didInit 放在哪里都不會起作用
}
});
??有過多線程并發編程經驗的人應該知道,上面的 didInit
將不起作用,且程序可能將在初始化時陷入死循環。雖然客戶端 JavaScript 是單線程的,但由于 JavaScript 有異步語法,上述代碼仍然會造成對 didInit 的異步并發訪問,導致 didInit
不起作用。由于 useEffect 可以被反復觸發,如果上述的函數 init()
進行了對 state 的異步更新,這將導致對 useEffect 的持續循環觸發。
??由于 JavaScript 不支持多線程鎖,所以它無法使用 雙重檢查鎖定
。因此,在 React 中,不要自作聰明編寫這種壞代碼。
??如果想知道更多關于從 Class 組件到 Hook 的重構方法,可見:https://react.docschina.org/docs/hooks-faq.html#from-classes-to-hooks
原文鏈接:https://blog.csdn.net/wangpaiblog/article/details/123304632
相關推薦
- 2022-06-08 Spring Cloud Nacos 配置動態刷新
- 2022-12-29 python中的多進程的創建與啟動方式_python
- 2024-02-27 Action獲取表單提交數據
- 2022-10-22 SQLMAP插件tamper編寫與使用詳解_MsSql
- 2022-09-02 Redis解決Session共享問題的方法詳解_Redis
- 2021-10-12 shell實現Fisher–Yates?shuffle洗牌算法介紹_linux shell
- 2022-03-15 GO + React + Axios Response to preflight request
- 2022-08-27 C#實現截圖幫助類_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支