react的虛擬dom是以什麼形式存儲在哪裡的?
最近在學習react,想知道react的虛擬dom是儲存在哪裡的?是內存中嗎?是以什麼形式存儲的呢?
存在硬碟里(手動滑雞
當然是存在內存里啦,被 ReactDOM 渲染出來的 DOM element,都有一個屬性,指向了這個 DOM Element 的 ReactDOMComponent 實例。
function getClosestInstanceFromNode(node) {
if (node[internalInstanceKey]) {
return node[internalInstanceKey];
}
...
react/ReactDOMComponentTree.js at master · facebook/react · GitHub
在這個 ReactDOMComponent 實例里,又有一個屬性 ._currentElement 指向該 component 的 ReactElement 實例。function ReactDOMComponent(element) {
var tag = element.type;
validateDangerousTag(tag);
this._currentElement = element;
...
react/ReactDOMComponent.js at master · facebook/react · GitHub
ReactComponent 實例的 .render() 被調用時,返回新的 ReactElement 實例_renderValidatedComponentWithoutOwnerOrContext: function() {
var inst = this._instance;
if (__DEV__) {
if (this._debugID !== 0) {
ReactInstrumentation.debugTool.onBeginLifeCycleTimer(
this._debugID,
render
);
}
}
var renderedComponent = inst.render();
...
react/ReactCompositeComponent.js at master · facebook/react · GitHub
ReactDOM 會先比較這個組件的 prev ReactElement 和 next ReactElement ,對 DOM element 做相應的更新
react/ReactDOMComponent.js at master · facebook/react · GitHub綜上我們可以看到,React 裡面對 DOM 的表示是虛擬的。React 實際上並不依賴 DOM ,節點的層級關係保存在 ReactDOMComponent 和 ReactElement 實例里。
如果業務代碼沒有直接用到瀏覽器 DOM API ,可以把 ReactDOM renderer 替換成其他 render 。
react/src/renderers at master · facebook/react · GitHub
名次解釋
ReactComponent: React.Component 的子類DOM element: 網頁 DOM tree 中的 element 節點ReactDOM: React DOM renderer , 把 ReactComponent 實例渲染成 DOM ElementReactDOMComponent: ReactDOM 對於 DOM element tree 的虛擬表示(virtual representation)
ReactElement: 調用 ReactComponent 實例的 render() ,會返回 ReactElement 實例,實質上是 plain js object擴展閱讀
React 官方文檔
React (Virtual) DOM Terminology以下是我關於 React 的一些答案,相當粗淺,希望對題主有幫助,也希望讀者多指正。React解決了前端開發中的哪些痛點? - 魯小夫的回答createClass() 的返回值與 createElement() 的返回值有什麼關係? - 魯小夫的回答React.createClass中console.log(this)結果是Coustructor? - 魯小夫的回答React中的virtual dom是否可以理解為當前組件的view model? - 魯小夫的回答如何理解react componentWillUnmount事件? - 魯小夫的回答react redux怎樣寫可重用組件? - 魯小夫的回答推薦閱讀:
※React首次渲染
※對React應用的一些思考
※現在(2017年)是否還有必要學習jQuery?
※如何入門 React?你應該跟著這八步走
※做前端如何克服新技術焦慮?
TAG:React |