setState机制(源码分析)

 

1.ReactElement和ReactComponent和React组件实例是三个不同的东西,目测可以通过方法相互得到。
2.通过getInternalInstanceReadyForUpdate()方法传入React组件实例,得到ReactComponent,
内部是用从ReactInstanceMap取出ReactComponent组件,还记得mountComponent时把ReactElement作为key,将ReactComponent存入了map中了吧,ReactComponent是React组件的核心,包含各种状态,数据和操作方法。而ReactElement则仅仅是一个数据类
3. var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = [])根据这句话得出_pendingStateQueue存state的数组是ReactComponent下的一个属性
4.事物里的那个布尔值是isBatchingUpdates,如果不是正处于创建或更新组件阶段,则处理update事务 if (!batchingStrategy.isBatchingUpdates)
5.过程一:
setState调用enqueueSetState,enqueueSetState将state放入队列中,并调用enqueueUpdate处理要更新的ReactComponent,然后在enqueueUpdate方法内部,如果组件当前正处于update事务中,则先将ReactComponent存入dirtyComponent中。否则调用batchedUpdates处理。在 batchedUpdates里,先把布尔值isBatchingUpdates布尔值置为true,然后用事务transaction.perform(callback, null, a, b, c, d, e)调用。在transaction.perform中, 先运行所有wrapper中的initialize方法 this.initializeAll(0);, 再执行perform方法传入的callback ret = method.call(scope, a, b, c, d, e, f); (目测这里的method就是transaction.perform(callback, null, a, b, c, d, e)里面的callback),然后 最后运行wrapper中的close方法this.closeAll(0);
6.过程二:
自解:transcation被包装在wrapper中,比如
var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
这里面有两个wrapper,每次执行initializeAll,是遍历TRANSACTION_WRAPPERS 这个数组里的每一项的initialize方法应该、。
注意:FLUSH_BATCHED_UPDATES 里的close方法里目测做的是更新组件和执行setState的回调函数,RESET_BATCHED_UPDATES里做的是将isBatchingUpdates设为了false,将这个状态的布尔值置为更新结束
FLUSH_BATCHED_UPDATES 在close阶段调用flushBatchedUpdates,flushBatchedUpdates内部调用runBatchedUpdates,runBatchedUpdates内部循环遍历dirtyComponents数组,主要干两件事。首先执行performUpdateIfNecessary来刷新组件的view,然后执行之前阻塞的callback。其中在performUpdateIfNecessary会分不同情况分别调用 ReactReconciler.receiveComponent(receiveComponent会最终调用到updateComponent,从而刷新View)和this.updateComponent
注意: 这里的ReactReconciler.receiveComponent内部目测会递归updateComponent,(自解除此之外应该也会有把ReactComponent转化成HTML的动作)

posted @ 2018-07-02 18:37  River89397380  阅读(104)  评论(0)    收藏  举报