React-請勿在循環或者條件語句中使用hooks

這是React Hooks的首要規則,這是因為React Hooks 是以單向循環鏈表的形式存儲,即是有序的。循環是為了從最后一個節點移到一個節點的時候,只需通過next一步就可以拿到第一個節點,而不需要一層層回溯。React Hooks的執行,分為?mount?和?update?階段,在mount階段的時候,通過mountWorkInProgressHook() 創建各個hooks (如useState, useMemo, useEffect, useCallback等),并且將當前hook添加到表尾。在update階段,在獲取或者更新hooks值的時候,會先獲取當前hook的狀態,hook.memoizedState,并且是按照順序或讀寫更新hook,若在條件或者循環語句使用hooks,那么在更新階段,若增加或者減少了某個hook,hooks的數量發生變化,而React是按照順序,通過next讀取下一個hook,則導致后面的hooks和掛載(mount)階段對應不上,發生讀寫錯值的情況,從而引發bug。

我們可以看看useState在mount階段的源碼:

function mountState<S>(initialState: (() => S) | S,
): [S, Dispatch<BasicStateAction<S>>] {const hook = mountWorkInProgressHook();if (typeof initialState === 'function') {// $FlowFixMe: Flow doesn't like mixed typesinitialState = initialState();}hook.memoizedState = hook.baseState = initialState;const queue: UpdateQueue<S, BasicStateAction<S>> = {pending: null,lanes: NoLanes,dispatch: null,lastRenderedReducer: basicStateReducer,lastRenderedState: (initialState: any),};hook.queue = queue;const dispatch: Dispatch<BasicStateAction<S>,> = (queue.dispatch = (dispatchSetState.bind(null,currentlyRenderingFiber,queue,): any));return [hook.memoizedState, dispatch];
}

useCallback在mount階段的源碼:

function mountCallback<T>(callback: T, deps: Array<mixed> | void | null): T {const hook = mountWorkInProgressHook();const nextDeps = deps === undefined ? null : deps;hook.memoizedState = [callback, nextDeps];return callback;
}

然后mountWorkInProgressHook的源碼如下:

function mountWorkInProgressHook(): Hook {const hook: Hook = {memoizedState: null,baseState: null,baseQueue: null,queue: null,next: null,};if (workInProgressHook === null) {// This is the first hook in the listcurrentlyRenderingFiber.memoizedState = workInProgressHook = hook;} else {// Append to the end of the listworkInProgressHook = workInProgressHook.next = hook;}return workInProgressHook;
}

其他hooks的源碼也是類似,以mountWorkInProgressHook創建當前hooks, 并且把hook的數據存到hook.memoizedState上,而在update階段,則是依次讀取hooks鏈表的memoizedState屬性來獲取狀態 (數據)。

React 為什么要以單向循環鏈表的形式存儲hooks呢?直接以key-value的對象形式存儲就可以在循環或者條件語句中使用hooks了,豈不更好?
這是因為react scheduler的調度策略如此,以鏈表的形式存儲是為了可以實現并發、可打斷、可恢復、可繼續執行下一個fiber任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77602.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大模型】 LangChain框架 -LangChain實現問答系統

LangChain 介紹與使用方法 1. 什么是 LangChain&#xff1f;2. LangChain 的主要功能3. 如何使用 LangChain&#xff1f;3.1 環境準備3.2 基本使用示例3.2.1 簡單的問答系統3.2.2 結合外部工具 3.3 高級用法 4. 常見問題及解決方法4.1 安裝問題4.2 運行問題4.3 性能問題 5. 實戰…

企業級HAProxy高可用離線部署實戰(附Kubernetes APIServer負載均衡配置)

企業級HAProxy高可用離線部署實戰&#xff08;附Kubernetes APIServer負載均衡配置&#xff09; 摘要&#xff1a;本文深入講解在離線環境下部署HAProxy 3.1.1的全流程&#xff0c;涵蓋源碼編譯、系統服務封裝、K8S APIServer四層負載配置等核心環節&#xff0c;并提供生產級高…

Python網絡爬蟲設計(一)

目錄 一、網絡爬蟲 1、基本的爬蟲 2、獲取URL 3、查找網頁源碼關鍵字 4、代碼實現 二、requests庫 1、requests的優勢和劣勢 2、獲取網頁的其他庫 &#xff08;1&#xff09;selenium庫 &#xff08;2&#xff09;pyppeteer庫 三、pyppeteer庫 1、pyppeteer庫的來歷…

BR_頻譜20dB 帶寬(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目錄 一、規范要求 1、協議章節 2、測試目的 二、測試方法 1、樣機初值條件&#xff1a; 2、測試步驟: 方法一&#xff1a;頻譜儀 方法二&#xff1a;綜測儀CMW500 3、預期結果 一、規范要求 1、協議章節 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知識庫的構建

一、簡介 我們在實現了一系列功能之后&#xff0c;終于來到了rag的部分&#xff0c;下面我們將基于langchain來實現一個rag檢索。 關于rag方面的知識&#xff0c;可以查看這兩篇文章&#xff1a; 大模型應用之RAG詳解 什么是 RAG&#xff08;檢索增強生成&#xff09; 或者是去…

CentOS7執行yum命令報錯 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7執行yum命令報錯 引更新yum源備份原有源創建新的源文件清理并重建緩存 引 CentOS 7 系統無法連接到 CentOS 的官方鏡像站點。這通常是由于網絡問題或 CentOS 7 已停止維護導致的&#xff08;2024年6月30日后 CentOS 7 已進入 EOL&#xff09; 報錯明細&#xff1a; 已…

VSCode安裝與環境配置(Mac環境)

20250419 - 概述 大概是非常久之前了&#xff0c;裝了VSCode&#xff0c;估計都得21的時候了&#xff0c;電腦上也沒更新過。當時安裝也直接裝上就完事了。這次把版本更新一下&#xff0c;同時記錄一下這個安裝過程。 安裝 mac下安裝非常簡單&#xff0c;直接從官網下載&am…

QML動畫--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行執行多個動畫的容器動畫類型&#xff0c;可以同時運行多個子動畫。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高頻面試題(四十三)——什么是人類偏好對齊中的「對齊稅」(Alignment Tax)?如何緩解?

一、什么是「對齊稅」(Alignment Tax)? 所謂「對齊稅」(Alignment Tax),指的是在使人工智能系統符合人類偏好的過程中,所不可避免付出的性能損失或代價。換句話說,當我們迫使AI遵循人類價值觀和規范時,AI系統往往無法達到其最大理論性能。這種性能上的妥協和折衷,就…

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標)

速查手冊&#xff1a;TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies&#xff08;重疊指標&#xff09; TA-Lib&#xff08;Technical Analysis Library&#xff09;是廣泛使用的金融技術分析庫&#xff0c;實現了超過150種技術指標計算函數&#xff0c;適用于股票…

重構未來智能:Anthropic 解碼Agent設計哲學三重奏

第一章 智能體進化論&#xff1a;從工具到自主體的認知躍遷 1.1 LLM應用范式演進圖譜 階段技術形態應用特征代表場景初級階段單功能模型硬編碼規則執行文本摘要/分類進階階段工作流編排多模型協同調度跨語言翻譯流水線高級階段自主智能體動態決策交互編程調試/客服對話 1.1.…

Git 中修改某個特定的commit提交內容

在 Git 中修改某個特定的提交&#xff08;commit&#xff09;通常需要使用 交互式變基&#xff08;Interactive Rebase&#xff09; 或 修改提交&#xff08;Commit Amend&#xff09;。以下是不同場景下的具體操作步驟&#xff1a; 一、修改最近的提交&#xff08;最新提交&am…

ZLMediaKit流媒體服務器

ZLMediaKit 簡介 ZLMediaKit 是一個基于 C11 開發的高性能流媒體服務器框架&#xff0c;支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多種流媒體協議。 主要特性 多協議支持&#xff1a; 支持 RTSP/RTMP/HLS/HTTP-F…

數字電子技術基礎(五十)——硬件描述語言簡介

目錄 1 硬件描述語言簡介 1.1 硬件描述語言簡介 1.2 硬件編程語言的發展歷史 1.3 兩種硬件描述的比較 1.4 硬件描述語言的應用場景 1.5 基本程序結構 1.5.1 基本程序結構 1.5.2 基本語句和描述方法 1.5.3 仿真 1 硬件描述語言簡介 1.1 硬件描述語言簡介 硬件描述語…

SQL系列:常用函數

1、【MySQL】合并字段函數&#xff08;列轉行&#xff09; 它可以將兩個字段中的數據合并到一個字段中。 1&#xff09;CONCAT函數 CONCAT函數可以將多個字段中的數據合并到一個字段中。它的語法格式如下&#xff1a; SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多線程和線程同步

多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性 提高程序的并發性:1.多線程,對系統資源的消耗更小一些 2.多進程 系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,…

時序數據預測:TDengine 與機器學習框架的結合(一)

一、引言 在當今數字化時代&#xff0c;時序數據如潮水般涌來&#xff0c;廣泛存在于物聯網、工業監控、金融交易、氣象監測等眾多領域。這些按時間順序記錄的數據蘊含著豐富的信息&#xff0c;對其進行準確預測&#xff0c;能夠為企業和組織的決策提供有力支持&#xff0c;帶…

elementUI中MessageBox.confirm()默認不聚焦問題處理

在項目中使用elementUI的MessageBox.confirm()出現了默認不聚焦的問題&#xff0c;默認確認按鈕是淺色的&#xff0c;需要點擊一下才會變成正常。面對這種問題&#xff0c;創建新組件&#xff0c;實現聚焦。替換默認的MessageBox.confirm() 解決 創建components/MessageBoxCo…

yarn的定義

YARN 即 Yet Another Resource Negotiator&#xff0c;它是 Apache Hadoop 2.x 及后續版本中的集群資源管理系統&#xff0c;也是 Hadoop 生態系統的核心組件之一。 YARN 的誕生是為了解決 Hadoop 1.x 中 MapReduce 框架將資源管理和作業調度任務耦合在一起所帶來的可擴展性差等…

http、https、TLS、證書原理理解,對稱加密到非對稱加密問題,以及對應的大致流程

http 超文本傳輸協議 存在問題&#xff1a; 安全性、隱私性、數據完整性 易被中間人&#xff08;黑客之類的&#xff09;對數據進行劫持、篡改、隱私泄露 引出了 https &#xff08;source&#xff09; http 在網絡模型中的應用層 Application > transport > inter…