從原始碼的角度再看 React JS 中的 setState
在這一篇文章中,我們從原始碼的角度再次理解下 setState 的更新機制,供深入研究學習之用。
原始碼的部分為了保證格式顯示正常就截圖了,檢視原始碼點選對應的連結直接跳轉至 GitHub 檢視即可。
1. React 中的 setState 更新邏輯程式碼
在更新邏輯的部分,可以看到 React 會透過 batchingStrategy.isBatchingUpdates
判斷當前的邏輯狀態下是否需要進行批次更新。
如果不是,那麼就直接進行頁面的批次更新,將之前累積的所有狀態一次更新到元件上。就是類似我們上一篇文章中舉例的快遞點一次將所有的快遞寄出。
如果是,那麼所有的元件狀態不進行立即更新,而是將元件狀態存放在一個叫
dirtyComponents
的陣列中去,等待下次更新時機的到來再進行更新。
2. React 中的 Transaction 設計
為了實現上述的更新邏輯,React 設計了 Transaction 的邏輯,看起來也像是資料庫中的事務。
原始碼中如圖所示,給出了一幅圖以及大段的解釋。
React 將整個的函式執行過程包裹上了 Transaction,在函式執行前與執行後分別有 initialize
和 close
兩個方法。
這樣的話 React 就有時機在函式執行過程中,涉及到 setState 的執行,都將快取下來,在 close
的時候進入到 React 的 state 更新邏輯進行更新判斷操作,並最終更新到前臺的 DOM 上。
其實 Virtual DOM 的框架都會有這樣的設計邏輯,理解了這樣的底層設計才能很好地理解一些方法在前臺的表現行為。
Vue.js 中也有類似的設計邏輯,後續如果有時間我們將繼續進行相關討論。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2808640/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從Vue.js原始碼角度再看資料繫結Vue.js原始碼
- React原始碼閱讀:setStateReact原始碼
- React原始碼解讀之setStateReact原始碼
- React 原始碼剖析系列 - 解密 setStateReact原始碼解密
- 在 React 16 中從 setState 返回 null 的妙用ReactNull
- React - setState原始碼分析(小白可讀)React原始碼
- 對react中setState的總結React
- 基於React 原始碼深入淺出setState:setState非同步實現React原始碼非同步
- React-原始碼解析-setState執行機制React原始碼
- 從原始碼的角度再學「Thread」原始碼thread
- 「從原始碼中學習」Vue原始碼中的JS騷操作原始碼VueJS
- [Vue.js進階]從原始碼角度剖析Vue的生命週期Vue.js原始碼
- React中setState真的是非同步的嗎React非同步
- 關於react中setState的深入理解React
- 基於React 原始碼深入淺出setState:官方文件的啟示錄React原始碼
- [Vue.js進階]從原始碼角度剖析計算屬性的原理Vue.js原始碼
- 從JDK原始碼角度看FloatJDK原始碼
- 從JDK原始碼角度看LongJDK原始碼
- 從JDK原始碼角度看IntegerJDK原始碼
- 從 JDK 原始碼角度看 BooleanJDK原始碼Boolean
- 從原始碼角度來讀Handler原始碼
- 從面試角度分析ArrayList原始碼面試原始碼
- 從 JDK 原始碼角度看 ObjectJDK原始碼Object
- 從JDK原始碼角度看ShortJDK原始碼
- 從 JDK 原始碼角度看 java 併發執行緒的中斷JDK原始碼Java執行緒
- 從原始碼的角度看 Service 是如何啟動的原始碼
- 從原始碼的角度解析Mybatis的會話機制原始碼MyBatis會話
- 從原始碼的角度看Activity是如何啟動的原始碼
- 【Mybatis系列】從原始碼角度理解Mybatis的$和#的作用MyBatis原始碼
- 從0.1+0.2=0.30000000000000004再看JS中的Number型別JS型別
- 從原始碼角度談談AsyncTask的使用及其原理原始碼
- React 中 setState() 為什麼是非同步的?React非同步
- 從一次react非同步setState引發的思考React非同步
- 從原始碼角度看ContentProvider原始碼IDE
- 從原始碼角度分析 MyBatis 工作原理原始碼MyBatis
- 從面試角度分析LinkedList原始碼面試原始碼
- React中setState修改深層物件React物件
- react——js原始碼解析ReactJS原始碼