上一篇文章說到React代碼經過編譯後,會將JSX的語法都經過react.createElement函數轉換成一個對象傳入的ReactDOM.render中。本章將會接著閱讀ReactDOM.render中是如何將元素生成虛擬DOM以及如何渲染到頁面中的。
Lam:小前端讀源碼 - React16.7.0(一)?zhuanlan.zhihu.com接著上一章說到的,去看看ReactDOM裡面到底有什麼。從源碼當中我們發現ReactDOM提供了一些屬性和方法。其中的作用自行查文檔了。
- createPortal
- findDOMNode
- hydrate
- render
- unstable_renderSubtreeIntoContainer
- unmountComponentAtNode
- unstable_createPortal
- unstable_batchedUpdates
- unstable_interactiveUpdates
- flushSync
- unstable_createRoot -> React 17版本將會廢除
- unstable_flushControlled
- __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
我們經常使用的一般都是ReactDOM.render這個API,將我們的組件渲染到頁面中,我們就一起看看render裡面到底做了什麼事情吧!
首先render接受3個參數,element、container、callback。從React16版本開始,element就是我們經過react.createElement後返回的對象。container就是我們需要渲染到的元素。render將不會return會組件對象了,改為在callback中返回。在render中會將數據傳入一個叫做legacyRenderSubtreeIntoContainer的方法中。
legacyRenderSubtreeIntoContainer
首先legacyRenderSubtreeIntoContainer會檢查傳入的container的類型,如果傳入的類型不符合規定將會報錯。那麼可以傳入什麼類型呢?
function isValidContainer(node) {
return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === react-mount-point-unstable ));
}
react會檢測傳入的container的nodeType是需要等於1、9、11或者8,如果nodeType等於8的情況下,還需要nodeValue必須等於" react-mount-point-unstable "。
TAG:React | 前端框架 | JavaScript |