国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

前端面試必考題:React Hooks原理剖析

開發 前端
本文用比較精煉的語言來闡述了 React Hooks 的原理,目的是讓讀者有一個感性的認識,也便于應付面試。

為什么要學習 React Hooks 原理

首先,功利點來說:目前前端框架三分天下:React、Vue、Angular,而 React 自從 v16.8.0 版本正式推出 React Hooks 概念后,風勢已經從原來的類組件猛地轉向函數組件,這是一個在設計模式、心智模型層次,且非常近期的革新,因此只要是你談到自己會 React ,就一定會在面試中被問到 React Hooks 的原理。

再者,從實際角度出發,了解 React Hooks 原理對我們日常開發調試都有莫大的好處;我們可以認識到 React Hooks 其實也并不是什么黑魔法,我們在開發中碰到的奇奇怪怪的問題,只不過是我們還沒有掌握 React Hooks 導致的,也不需要用一些 tricky 的方法來解決。

useState / useReducer

useState 和 useReducer 都是關于狀態值的提取和更新,從本質上來說沒有區別,從實現上,可以說 useState 是 useReducer 的一個簡化版,其背后用的都是同一套邏輯。

React Hooks 如何保存狀態

React 官方文檔中有提到,React Hooks 保存狀態的位置其實與類組件的一致;翻看源碼后,我發現這樣的說法沒錯,但又不全面:

  •  兩者的狀態值都被掛載在組件實例對象FiberNode的memoizedState屬性中。
  •  兩者保存狀態值的數據結構完全不同;類組件是直接把 state 屬性中掛載的這個開發者自定義的對象給保存到memoizedState屬性中;而 React Hooks 是用鏈表來保存狀態的,memoizedState屬性保存的實際上是這個鏈表的頭指針。

下面我們來看看這個鏈表的節點是什么樣的 —— Hook 對象: 

  1. // react-reconciler/src/ReactFiberHooks.js  
  2. export type Hook = {  
  3.   memoizedState: any, // 最新的狀態值  
  4.   baseState: any, // 初始狀態值,如`useState(0)`,則初始值為0  
  5.   baseUpdate: Update<any, any> | null,  
  6.   queue: UpdateQueue<any, any> | null, // 臨時保存對狀態值的操作,更準確來說是一個鏈表數據結構中的一個指針  
  7.   next: Hook | null,  // 指向下一個鏈表節點  
  8. }; 

官方文檔一直強調 React Hooks 的調用只能放在函數組件/自定義 Hooks 函數體的頂層,這是因為我們只能通過 Hooks 調用的順序來與實際保存的數據結構來關聯:

PS:雖然上面一致都是以 useState 和 useReducer 來作為例子說明,但實際上所有 React Hooks 都是用這種鏈表的方式來保存的。

React Hooks 如何更新狀態

熟悉 useState API 的話,我們都知道怎么去更新狀態: 

  1. const [name, setName] = useState('')  
  2. setName('張三') 

那么,由 useState 返回的這個用來更新狀態的函數(下文稱為 dispatcher),運行的原理是怎么樣的呢?

當我們在每次調用 dispatcher 時,并不會立刻對狀態值進行修改(對的,狀態值的更新是異步的),而是創建一條修改操作——在對應 Hook 對象的queue屬性掛載的鏈表上加一個新節點:

在下次執行函數組件,再次調用 useState 時, React 才會根據每個 Hook 上掛載的更新操作鏈表來計算最新的狀態值。你也許會好奇,為什么要把更新操作都保存起來呢,只保存最新的一次更新操作不就行了嗎?你會這樣想,大概是忘了 useState 支持這樣的語法了吧: 

  1. const [name, setName] = useState('')  
  2. setName(name => name + 'a')  
  3. setName(name => name + 'b')  
  4. setName(name => name + 'c')  
  5. // 下次執行時就可以得到 name 的最新狀態值為'abc'啦 

useEffect

useEffect 的保存方式與 useState / useReducer 類似,也是以鏈表的形式掛載在FiberNode.updateQueue中。

下面我們按 mount 和 update 這兩個組件生命周期來闡述 useEffect 的執行原理:

mount 階段:mountEffect

  1.  根據函數組件函數體中依次調用的 useEffect 語句,構建成一個鏈表并掛載在FiberNode.updateQueue中,鏈表節點的數據結構為: 
  1.  const effect: Effect = {  
  2.     tag, // 用來標識依賴項有沒有變動  
  3.     create, // 用戶使用useEffect傳入的函數體  
  4.     destroy, // 上述函數體執行后生成的用來清除副作用的函數  
  5.     deps, // 依賴項列表  
  6.     next: (null: any),  
  7. }; 
  1.  組件完成渲染后,遍歷鏈表執行。

update 階段:updateEffect

  1.  同樣在依次調用 useEffect 語句時,判斷此時傳入的依賴列表,與鏈表節點Effect.deps中保存的是否一致(基本數據類型的值是否相同;對象的引用是否相同),如果一致,則在Effect.tag標記上NoHookEffect。

執行階段

在每次組件渲染完成后,就會進入 useEffect 的執行階段:function commitHookEffectList():

  1.  遍歷鏈表
  2.  如果遇到Effect.tag被標記上NoHookEffect的節點則跳過。
  3.  如果Effect.destroy為函數類型,則需要執行該清除副作用的函數(至于這Effect.destroy是從哪里來的,下面馬上說到)
  4.  執行Effect.create,并將執行結果保存到Effect.destroy(如果開發者沒有配置return,那得到的自然是undefined了,也就是說,開發者認為對于當前 useEffect 代碼段,不存在需要清除的副作用);注意由于閉包的緣故,Effect.destroy實際上可以訪問到本次Effect.create函數作用域內的變量。

我們重點請注意到:是先清除上一輪的副作用,然后再執行本輪的 effect 的。

其它 React Hooks Api

其它的的 React Hooks Api ,其實也差不多是這樣的原理:用鏈表數據結構來做全局狀態保持;判斷依賴項決定是否要更新狀態等等,這里不再累述。

總結

本文用比較精煉的語言來闡述了 React Hooks 的原理,目的是讓讀者有一個感性的認識,也便于應付面試;但實際上 React Hooks 還有非常多的實現細節,有興趣請閱讀源碼,入口在此。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2025-02-28 08:34:01

2023-06-26 08:24:23

JavaScriptAJAX

2020-03-16 10:25:49

前端React Hooks響應式布局

2022-03-16 22:24:50

ReactstateHooks

2019-08-20 15:16:26

Reacthooks前端

2022-12-23 09:51:18

銳捷

2023-05-29 10:38:00

HTML5離線存儲

2012-05-08 16:11:14

WEB前端開發面試

2023-06-02 08:49:25

優雅降級CSS3

2022-07-25 17:37:05

數字化轉型資產信息化

2021-03-18 08:00:55

組件Hooks React

2024-06-07 06:29:49

2017-08-16 10:03:57

前端面試題算法

2023-11-06 08:00:00

ReactJavaScript開發

2019-03-13 10:10:26

React組件前端

2020-11-24 07:48:32

React

2022-02-09 07:40:42

JavaScript前端面試題

2018-05-10 16:52:03

阿里巴巴前端面試題

2019-02-21 14:12:26

前端面試題Vue

2023-06-29 07:48:35

異步加載JavaScript
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区免费看| 日韩毛片视频| 日本久久精品一区二区| 色一情一乱一伦一区二区三区日本| av高清资源| 麻豆网在线观看| 欧美猛男同性videos| 久久在线视频| 成人一区二区三区在线观看| 国产蜜臀av在线一区二区三区| 国产91丝袜在线播放| 成人丝袜18视频在线观看| 91福利区一区二区三区| 97精品国产91久久久久久| 久久99精品久久久久久三级| 日本一区美女| 2018高清国产日本一道国产| 91三级在线| 国产免费久久| 99久久精品免费看国产免费软件| 色综合激情久久| 隔壁老王国产在线精品| 欧美日韩成人一区二区三区| 国产免费福利| 国产精品字幕| 裸体在线国模精品偷拍| 亚洲综合激情另类小说区| 国产69精品久久久| 亚洲成人18| 四虎在线免费观看| 日本精品不卡| 国产亚洲高清一区| 91成人超碰| 一区二区激情视频| 热久久这里只有| 91社在线播放| 好男人免费精品视频| 伊人精品综合| 国产成人99久久亚洲综合精品| 亚洲精品视频一区二区| 久久艳片www.17c.com| 亚洲欧美日韩在线综合| 能在线看的av| 在线精品国产| 欧美视频一区在线观看| 国产视频久久久久| 亚洲精品久久区二区三区蜜桃臀 | 久久精品国产秦先生| 欧美视频亚洲视频| 99精品一区二区| 欧美一区二区三区爱爱| 国产精品va在线播放我和闺蜜| 日本一区二区在线视频| 成人综合影院| 久久久久电影| 色88888久久久久久影院野外| 毛片av在线播放| 91丨精品丨国产| 一区二区三区四区不卡在线 | 黄色av资源| 日韩毛片一区| 国模大尺度一区二区三区| 亚洲免费视频网站| 少妇一级淫免费放| 亚洲国产网址| 色老头久久综合| 国产高清一区视频| 国产三线在线| 国产精品一二三四区| 中文字幕亚洲欧美日韩高清| 丰满少妇被猛烈进入高清播放| 毛片在线不卡| 亚洲欧美另类久久久精品| 91蜜桃网址入口| 成人精品视频.| 91高潮在线观看| 新欧美整片sss第一页| 日韩精品欧美大片| 99久久免费国产| 最近2019年中文视频免费在线观看| 国产bdsm| 久久久久久久久久久久久久 | 欧美性猛交xxxxx免费看| 亚洲精品乱码久久久久久蜜桃91| 波多野结衣在线观看一区二区| 国产亚洲精品激情久久| 黄色网在线播放| 欧美日韩一级二级| xxx亚洲日本| 久久动漫网址| 亚洲色图35p| 伊人网站在线| 盗摄精品av一区二区三区| 91日韩久久| 一本大道色婷婷在线| 亚洲美腿欧美偷拍| 日韩欧美亚洲日产国产| 国产精品网在线观看| 欧美丰满少妇xxxbbb| 国产一级特黄a大片99| 欧美男人天堂| 欧美性大战久久| av7777777| 日韩视频一区二区三区在线播放免费观看| 国产高清在线不卡| 国语产色综合| 17婷婷久久www| 欧美天堂一区| 亚洲视频在线免费看| 精品一二三四| 精品久久久久久久中文字幕| 丁香婷婷激情| 亚洲日本丝袜连裤袜办公室| 四虎永久在线精品无码视频| 91老师片黄在线观看| 免费黄色网页| 亚洲国产精品国自产拍av| www.色偷偷.com| 国产日韩高清一区二区三区在线| 国产在线久久久| 欧美午夜精品一区二区三区电影| 欧美激情第99页| 国产精东传媒成人av电影| 国产成人avxxxxx在线看| 成人免费网址在线| 99综合电影在线视频| 综合色婷婷一区二区亚洲欧美国产| 三级久久三级久久久| 久久精品日产第一区二区三区精品版| 日韩精品1区| 成人做爰66片免费看网站| 我不卡影院28| 国产91精品入口17c| 日本欧洲一区二区| 草草草视频在线观看| 国产不卡一区视频| 国产喷水theporn| 香蕉加勒比综合久久| 污污网站在线看| 中文字幕在线国产精品| 99精品中文字幕在线不卡 | 欧美日本视频在线| www.精品| 国产精品亚洲精品| 一区二区视频免费完整版观看| 中文字幕亚洲综合久久筱田步美| 欧美影院视频| 91久久久久久久久| 黄页视频在线91| 爱情岛论坛vip永久入口| 欧美一二三四区在线| 精品久久免费| xxxxxx在线观看| 亚洲激情图片小说视频| 韩国中文字幕在线| 欧美极品少妇xxxxx| 免费人成精品欧美精品 | 一区二区三区在线| 国产成a人亚洲精v品在线观看| 欧美一级xxx| 麻豆一区一区三区四区| 一区二区日本伦理| 欧美午夜宅男影院在线观看| 9久久婷婷国产综合精品性色| 亚洲成人精品视频| 亚洲91中文字幕无线码三区| 精品免费久久久久久久| 亚洲国产精品麻豆| 久久国产精品免费一区二区三区| 国产精品国产三级国产aⅴ9色 | 欧美高清自拍一区| 麻豆精品一二三| av二区在线| 欧美国产日韩一区二区三区| 中文字幕一区二区三区久久网站| 人妻丰满熟妇av无码区app| 欧美不卡一区二区三区四区| 亚洲美洲欧洲综合国产一区| 四虎精品一区二区永久在线观看| 欧美美女喷水视频| 奇米影视亚洲| 国产国产人免费人成免费视频| 午夜精品久久久久久久久久久久| 国产精品66部| 2021国产在线| 岛国视频一区| 欧美午夜片欧美片在线观看| 久久69成人| 成年人视频大全| 日韩精品资源二区在线| 亚洲国产精品久久久天堂| 青青色在线视频| 国产精品久久久久久搜索| 国产精品美日韩| 永久免费精品视频| 天天影视综合色| 在线观看欧美日韩国产| 国产精品99久久久久久久vr| 日本一级理论片在线大全| 青青草原亚洲|