最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react16中的hooks的底層實現(xiàn)原理

 更新時間:2025年09月29日 10:06:49   作者:光影少年  
本文主要介紹了react16中的hooks的底層實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

好的 ??,你問的是 React 16 中所有 Hooks 的底層實現(xiàn)和原理。

這里我會分幾個層次來解釋:

  1. React 16 的背景
  2. Hooks 的設(shè)計理念
  3. 核心 Hooks 的底層實現(xiàn)思路(useStateuseEffectuseContext, …)
  4. React 內(nèi)部的 Hook 數(shù)據(jù)結(jié)構(gòu)
  5. 執(zhí)行流程(函數(shù)組件渲染時 Hook 的調(diào)用順序)

1. 背景:React 16 與 Hooks

  • React 16.8 是第一個支持 Hooks 的版本。
  • 目標:讓函數(shù)組件具備狀態(tài)(state)和副作用(effect)的能力,替代部分 class 組件邏輯(比如 componentDidMount / componentDidUpdate / componentWillUnmount)。
  • 核心思想通過“調(diào)用順序”來匹配 Hook 與組件的 fiber 節(jié)點,避免顯式 id。

2. Hooks 的設(shè)計理念

React Hooks 有幾個原則:

  1. 只能在函數(shù)組件頂層調(diào)用,不能在條件語句或循環(huán)里動態(tài)調(diào)用。
    • 這是因為 Hooks 依賴調(diào)用順序來定位。
  2. 只能在 React 函數(shù)組件或自定義 Hook 中調(diào)用。
  3. 每個組件 fiber 節(jié)點維護一個單鏈表,鏈表節(jié)點就是 Hook 對象。

?? 這就是為什么 eslint-plugin-react-hooks 會強制規(guī)則:不要在 if/for 中調(diào)用 Hook

3. 常見 Hooks 的底層原理

(1)useState

  • 本質(zhì)是 useReducer 的語法糖。
  • 內(nèi)部維護一個 Hook 節(jié)點對象(鏈表的一部分):
type Hook = {
  memoizedState: any,     // 當前的 state
  baseState: any,         // 初始 state
  queue: UpdateQueue,     // 更新隊列(鏈表結(jié)構(gòu))
  next: Hook | null       // 指向下一個 Hook
}
  • 當你調(diào)用 useState(initial) 時:
    • 創(chuàng)建一個更新對象(action)。
    • 掛到 queue 上。
    • 觸發(fā) scheduleUpdateOnFiber,進入調(diào)度。
    1. React 在當前 fiber 上創(chuàng)建一個 Hook 節(jié)點,memoizedState = initial。
    2. 返回 [state, dispatch]
    3. dispatch 本質(zhì)是一個函數(shù):
  • 渲染時,React 會執(zhí)行 processUpdateQueue,消費 queue,更新 memoizedState

(2)useEffect

  • 保存副作用函數(shù)和依賴數(shù)組。
  • Hook 節(jié)點結(jié)構(gòu):
type Effect = {
  tag: HookFlags,          // effect 類型(Passive, Layout 等)
  create: () => (() => void) | void,  // 副作用函數(shù)
  destroy?: () => void,    // 清理函數(shù)
  deps: any[] | null,      // 依賴
  next: Effect | null
}
  • 調(diào)用 useEffect(fn, deps) 時:
    • 如果 deps 變了,就調(diào)用上一次的 destroy(清理),再執(zhí)行新的 create。
    • 如果沒變,則跳過。
    1. React 在 Hook 節(jié)點里記錄 create 和 deps。
    2. 在 commit 階段(DOM 更新后),React 比較新舊依賴:

(3)useLayoutEffect

  • 和 useEffect 類似,但執(zhí)行時機不同:
    • useLayoutEffect 在 DOM 更新后、瀏覽器繪制前 執(zhí)行(同步)。
    • useEffect 在 瀏覽器繪制后 執(zhí)行(異步,延遲)。
  • 用于測量 DOM、同步操作。

(4)useContext

  • 獲取 Context 的值。
  • 機制:
    • 組件調(diào)用 useContext(MyContext) 時,會在 fiber 上記錄對 MyContext 的依賴。
    • 當 Context Provider 的值變化時,React 會找到所有依賴它的消費 fiber,觸發(fā)更新。

(5)useReducer

  • 類似 Redux 的 reducer:
    • useState 底層其實就是 useReducer 的特例:

      useState(initial) === useReducer((s, a) => typeof a === 'function' ? a(s) : a, initial)
      
  • 保存 reducer 和 state,通過 dispatch 觸發(fā)更新。

(6)useRef

  • 維護一個 { current: any } 對象,整個生命周期內(nèi)保持引用不變。
  • 實現(xiàn):只在 Hook 節(jié)點里存一個 memoizedState = { current: initialValue },之后不會更新。

(7)useMemo/useCallback

  • 本質(zhì)是“帶緩存的值 / 函數(shù)”。
  • Hook 節(jié)點保存 value 和 deps。
  • 渲染時對比依賴數(shù)組:
    • 如果沒變,直接返回舊值。
    • 如果變了,重新計算并緩存。

4. React 內(nèi)部 Hook 數(shù)據(jù)結(jié)構(gòu)

在 fiber 節(jié)點上,每個函數(shù)組件對應(yīng)一個 Hook 鏈表

type Fiber = {
  memoizedState: Hook | null; // hook 鏈表頭
  updateQueue: any;
  // ...
}
  • renderWithHooks 函數(shù):
    • 進入函數(shù)組件渲染時,初始化 currentlyRenderingFiber。
    • 每調(diào)用一個 Hook,就在鏈表上走一步,復(fù)用或新建節(jié)點。
    • 保證 “調(diào)用順序一致 = Hook 順序一致”。

5. Hook 執(zhí)行流程總結(jié)

  1. 初次渲染
    • 執(zhí)行函數(shù)組件,依次調(diào)用 useState / useEffect …
    • 為每個 Hook 創(chuàng)建一個 Hook 節(jié)點,掛到 fiber.memoizedState 鏈表上。
  2. 更新渲染
    • 執(zhí)行組件時,React 會遍歷 fiber.memoizedState 鏈表。
    • 每次調(diào)用 Hook,就拿到對應(yīng)節(jié)點,復(fù)用之前的狀態(tài)。
    • 如果調(diào)用順序錯了(比如把 Hook 放到 if 里),鏈表錯位,React 會報錯。
  3. 提交階段(commit phase)
    • 對于 useEffect / useLayoutEffect,會根據(jù)依賴比較來執(zhí)行副作用。
    • 對于 useState / useReducer,會處理更新隊列,得到新 state。

? 總結(jié):

  • React Hooks 的底層實現(xiàn)是 fiber 節(jié)點上的 Hook 鏈表 + 調(diào)用順序保證。
  • 每個 Hook 維護一個小的狀態(tài)對象,存儲 memoizedState、queue、deps 等。
  • useState 基于更新隊列;useEffect 延遲到 commit 階段執(zhí)行;useRef 只是一個穩(wěn)定對象;useMemo / useCallback 做依賴比較。

到此這篇關(guān)于react16中的hooks的底層實現(xiàn)原理的文章就介紹到這了,更多相關(guān)react16 hooks底層原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React 中的雙緩存 Fiber 樹機制詳解

    React 中的雙緩存 Fiber 樹機制詳解

    本文詳細介紹了React中的雙緩存Fiber樹機制,包括概念、核心流程、優(yōu)勢以及面試中的常見問題和標準回答,通過"通俗+專業(yè)"的方式,幫助面試者全面理解React的性能優(yōu)化體系,掌握雙緩存Fiber樹的關(guān)鍵點,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 編寫React組件項目實踐分析

    編寫React組件項目實踐分析

    本文通過實例給大家分享了編寫React組件項目實踐的全過程,對此有興趣的朋友可以參考下。
    2018-03-03
  • React-Router v6實現(xiàn)頁面級按鈕權(quán)限示例詳解

    React-Router v6實現(xiàn)頁面級按鈕權(quán)限示例詳解

    這篇文章主要介紹了使用 reac+reactRouter來實現(xiàn)頁面級的按鈕權(quán)限功能,這篇文章分三部分,實現(xiàn)思路、代碼實現(xiàn)、踩坑記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-10-10
  • 用React實現(xiàn)一個簡單的虛擬列表

    用React實現(xiàn)一個簡單的虛擬列表

    虛擬列表是現(xiàn)在比較常用的前端渲染大數(shù)據(jù)列表的方案,目前也有很多組件庫和工具庫也都有對應(yīng)的實現(xiàn),本文將給大家介紹一下如何用React實現(xiàn)一個簡單的虛擬列表,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 一文詳解React組件API

    一文詳解React組件API

    這篇文章主要介紹了React的組件API,及組件API的用法詳解,文中有詳細的代碼示例,對學(xué)習(xí)或工作有一定的參考價值,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • React中重新實現(xiàn)強制實施表單的流程步驟

    React中重新實現(xiàn)強制實施表單的流程步驟

    這篇文章主要介紹了React中重新實現(xiàn)強制實施表單的流程步驟,就像設(shè)計人員一樣,在添加邏輯之前,您需要為不同的狀態(tài)“模擬”或創(chuàng)建“模擬”,例如,這里只是表單的視覺部分的模擬,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-05-05
  • react中(含hooks)同步獲取state值的方式

    react中(含hooks)同步獲取state值的方式

    這篇文章主要介紹了react(含hooks)中同步獲取state值的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 使用React Profiler進行性能優(yōu)化方案詳解

    使用React Profiler進行性能優(yōu)化方案詳解

    在現(xiàn)代前端開發(fā)中,性能優(yōu)化是一個不可忽視的重要環(huán)節(jié),在 React 生態(tài)系統(tǒng)中,React Profiler 是一個強大的工具,下面我們來看看如何使用它來提升我們的 React 應(yīng)用吧
    2025-03-03
  • 詳解React中setState回調(diào)函數(shù)

    詳解React中setState回調(diào)函數(shù)

    這篇文章主要介紹了詳解React中setState回調(diào)函數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • React中遍歷數(shù)組生成標簽問題

    React中遍歷數(shù)組生成標簽問題

    這篇文章主要介紹了React中遍歷數(shù)組生成標簽問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評論

米脂县| 公安县| 淳化县| 静安区| 孝昌县| 梅州市| 保康县| 黑山县| 台南市| 颍上县| 九龙城区| 嵩明县| 道真| 扎赉特旗| 龙南县| 大田县| 白朗县| 武威市| 南川市| 咸阳市| 晋城| 新密市| 烟台市| 安平县| 辉县市| 涡阳县| 德钦县| 旬阳县| 九龙县| 金华市| 潜山县| 建阳市| 紫阳县| 三明市| 祁连县| 电白县| 渭源县| 平阴县| 沙雅县| 屯留县| 即墨市|