【Under-the-hood-ReactJS-Part7】React源码解读

接上文,node

React流程图:
https://bogdan-lyashenko.gith...react

回到最初

做为挂载方法执行以后的输出,咱们获得了将用于插入DOM树的HTML元素。可是事实上,标签是生成了,可是mountComponenent--无论他叫什么---不是真正的HTML标签。它实际上是一种拥有字段children,node(真正的DOM节点)等的数据结构。当咱们将HTML元素插入到DOM中指定的容器时(在ReactDOM.render方法中指定的容器),React会将容器中插入位置以前的内容给删除。DOMLazyTree是个工具类,用于执行一些树数据结构的真正做用于DOM的相关操做。
在最好的过程当中,会执行parentNode.insertBefore(tree.node)方法,其中,parentNode是插入的容器中div节点,而tree.node则是咱们真正的ExamleApplication对应的div节点。终于,在挂载过程当中被建立的HTML元素被插入到DOM文档中。git

其实,上面步骤不是所有,如前文所讲,对挂载的调用是被包装进了一个事务中。也就是说,咱们须要调用close方法来关闭这个事务。咱们看下close包装器列表,大多数状况下,咱们须要恢复一些锁定的行为,好比ReactInputSelection.restoreSelection(),ReactBrowserEventEmitter.setEnabled(previouslyEabled),同时,也须要经过this.reactMountReady.notifyAll来通知执行全部以前放入transaction.reactMountReady队列里的回调。其中之一就是componentDidMount方法,这个方法会在close包装器里被触发。
如今,你应该对component did mount的含义有个比较清楚的认识了。github

更多有关关闭事务

在挂载过程当中,使用的事务不止上文的那一个,还有一个咱们以前用来包装ReactMount.atchedMountComponentIntoNode的调用。这个是须要关闭。数据结构

咱们检查下ReactUpdates.flushBatchedUpdates的包装器,它是用来处理dirtyComponents的。咱们刚刚完成了咱们的第一次挂载,这时候是没有dirtycomponents的,也就是说,在此次挂载中,它是一个空调用。因此,咱们能够关闭此次事务,而且能够说,批量更新策略已经完成了。
(未完待续)svg

相关文章
相关标签/搜索