【Under-the-hood-ReactJS-Part8】React源碼解讀

接上文,git

React流程圖:
https://bogdan-lyashenko.gith...github

this.setState

咱們已經知道掛載的工做流程,如今咱們換個方向研究下--setState方法,這個也是React的重要組成部分。ssh

首先,爲何咱們能夠在一些方法中調用setState方法呢?顯然,咱們的組件是從ReactComponent組件繼承下來的。咱們去React源碼中看下setState方法的實現:svg

//src\isomorphic\modern\class\ReactComponent.js#68
this.updater.enqueueSetState(this, partialState)

正如你所見的那樣,代碼裏有updater的相關調用,那麼,什麼是updater呢?在咱們對掛載過程的分析中,mountComponent的調用過程裏,實例會接收一個updater,做爲對
ReactUpdateQueue的引用(srcrendererssharedstackreconcilerReactUpdateQueue.js)this

深刻到enqueueSetState方法中,在起初,React會將partial state對象(經過this.setState傳入的對象)壓入到內部實例的_pendingStateQueue中(公共實例,指的是<ExampleApplicatioin>這種自定義實例,而內部實例,則是指掛載過程當中建立的ReactCompositeComponent組件)。緊接着,在調用enqueueUpdate方法的過程當中,會檢查是否組件在更新過程當中並將自定義組件壓入到dirtyComponent的列表裏,
若是沒有在更新過程當中,則初始化更新事務並壓入組件到dirtyComponent裏。code

歸納下,每一個組件都是有本身的阻塞狀態列表,每次你在一次事務中調用setState方法,
其實只是將對象壓入到一個隊列裏,而後,它們會依次合併成一個狀態。同時,當你調用setState方法時,React會將你的組件壓入到dirtyComponent的列表裏。看到這裏,你可能會有疑問,dirtyComponent是如何工做的。這個問題,咱們會在下一篇文章中進行解答。。。
(未完待續)對象

相關文章
相關標籤/搜索