和性能優化
https://mp.weixin.qq.com/s/3jmJgZFktP2NMT8XLvdIKQbabel
使用 React.createElement
或 JSX
編寫 React
組件,實際上全部的 JSX
代碼最後都會轉換成 React.createElement(...)
, Babel
幫助咱們完成了這個轉換的過程。函數
createElement
函數對 key
和 ref
等特殊的 props
進行處理,並獲取 defaultProps
對默認 props
進行賦值,而且對傳入的孩子節點進行處理,最終構形成一個 ReactElement
對象(所謂的虛擬 DOM
)。性能
ReactDOM.render
將生成好的虛擬 DOM
渲染到指定容器上,其中採用了批處理、事務等機制而且對特定瀏覽器進行了性能優化,最終轉換爲真實 DOM
。優化
JSX
只是爲 React.createElement(component,props,...children)
方法提供的語法糖。spa
全部的 JSX
代碼最後都會轉換成 React.createElement(...)
, Babel
幫助咱們完成了這個轉換的過程。code
因此使用了 JSX
的代碼都必須引入 React
。component
babel
在編譯時會判斷 JSX
中組件的首字母,當首字母爲小寫時,其被認定爲原生 DOM
標籤, createElement
的第一個變量被編譯爲字符串;當首字母爲大寫時,其被認定爲自定義組件, createElement
的第一個變量被編譯爲對象;對象
在 IE(8-11)
和 Edge
瀏覽器中,一個一個插入無子孫的節點,效率要遠高於插入一整個序列化完整的節點樹。
React
經過 lazyTree
,在 IE(8-11)
和 Edge
中進行單個節點依次渲染節點,而在其餘瀏覽器中則首先將整個大的 DOM
結構構建好,而後再總體插入容器。
而且,在單獨渲染節點時, React
還考慮了 fragment
等特殊節點,這些節點則不會一個一個插入渲染。