摘要:什么是虛擬在中,執行的結果得到的并不是真正的節點,結果僅僅是輕量級的對象,我們稱之為。后來產出的架構模式,期望從代碼組織方式來降低維護難度。
1、什么是虛擬DOM
在React中,render執行的結果得到的并不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM。
簡單的說,其實所謂的virtual DOM就是JavaScript對象到Html DOM節點的映射;即使用JavaScript對象將Html結構表示出來,而這個對象就是virtual DOM。
eg:
Html:
JavaScript對象表示(virtual DOM)
{ tagName: "ul", props: { id: "list" }, children: [ {tagName: "li", props: {class: "item"}, children: ["Item 1"]}, {tagName: "li", props: {class: "item"}, children: ["Item 2"]}, ] }2、什么時候會生成到virtual DOM
React生命周期擁有裝載、更新、卸載的三個階段;附上一張React生命周期圖
前面提到:render執行的結果得到的并不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,即在render函數調用時將會創建出虛擬DOM;
class Tab extends React.Component { render() { React.createElement( "p", { className: "class"}, "Hello React" ) } }
通過React.createElemen創建出虛擬DOM,而該函數只在Render函數中調用,所以在React裝載和更新的過程中才會有虛擬DOM的生成;至于掛載到真實DOM自然而然是ReactDom.render函數啦。
實現其實很簡單,主要是定義一個函數并把我們傳進去的參數組成一個React元素對象,而type就是我們傳進去的組件類型,可以是一個類、函數或字符串(如"div")
React大致源碼:
function createElement(type, config, children) { let propName; const props = {}; let key = null; let ref = null; let self = null; let source = null; if (config != null) { if (hasValidRef(config)) { // 如果有ref,將它取出來 ref = config.ref; } if (hasValidKey(config)) { // 如果有key,將它取出來 key = "" + config.key; } self = config.__self === undefined ? null : config.__self; source = config.__source === undefined ? null : config.__source; for (propName in config) { if ( hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName) ) { // 將除ref,key等這些特殊的屬性放到新的props對象里 props[propName] = config[propName]; } } } // 獲取子元素 const childrenLength = arguments.length - 2; if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { const childArray = Array(childrenLength); for (let i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 2]; } props.children = childArray; } // 添加默認props if (type && type.defaultProps) { const defaultProps = type.defaultProps; for (propName in defaultProps) { if (props[propName] === undefined) { props[propName] = defaultProps[propName]; } } } return ReactElement( type, key, ref, self, source, ReactCurrentOwner.current, props, ); } const ReactElement = function(type, key, ref, self, source, owner, props) { // 最終得到的React元素 const element = { // This tag allows us to uniquely identify this as a React Element $$typeof: REACT_ELEMENT_TYPE, // Built-in properties that belong on the element type: type, key: key, ref: ref, props: props, // Record the component responsible for creating this element. _owner: owner, }; return element; };
打印出組件:
4、為什么需要使用virtual DOM
DOM管理歷史階段:
JS 或者 jQuery 操作 DOM: 當應用程序越來越復雜,需要在JS里面維護的字段也越來越多,需要監聽事件和在事件回調用更新頁面的DOM操作也越來越多,應用程序會變得非常難維護。
后來產出 MVC、MVP 的架構模式,期望從代碼組織方式來降低維護難度。但是 MVC 架構并沒辦法減少維護的狀態,也沒有降低狀態更新時需要對頁面的更新操作,你需要操作的DOM還是需要操作,只是換了個地方。
既然狀態改變了要操作相應的DOM元素,為什么不做一個東西讓視圖和狀態進行綁定,狀態變更了視圖自動變更。這就是后來人們想出了 MVVM 模式,只要在模版中聲明視圖組件是和什么狀態進行綁定的,雙向綁定引擎就會在狀態更新的時候自動更新視圖;
但MVVM雙向數據綁定并不是唯一的辦法,還有一個非常直觀的方法:一旦狀態發生了變化,就用模版引擎重新渲染整個視圖,然后用新的視圖更換掉舊的視圖。
React采用的就是第四種模式;但是我們都知道對于操作DOM成本太高,而相對操作JavaScript就快速多了,而Html DOM可以很簡單的用JavaScript對象表示出來(Virtual DOM就這樣誕生了)
這樣的做法會導致很多的問題,最大的問題就是這樣做會很慢,因為即使一個小小的狀態變更都要重新構造整棵 DOM,性價比太低;而React Virtual DOM在狀態更新過程加了一些特別的操作來避免整棵 DOM 樹變更(它就是接下來的Diff算法)。
接下來的Diff算法即將更新,敬請期待~~~
“積跬步、行千里”—— 持續更新中~,喜歡留下個贊哦!
往期經典好文:
團隊合作必備的Git操作
談談Js前端規范化
相關專欄推薦:
React學習之路
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/54612.html
摘要:傳統算法的一大特點就是虛擬的算法,下圖為實現流程圖。如果的子節點仍有子節點依舊順次執行。我們來觀察下復雜度傳統算法的復雜度為,單純從看,復雜度不到,但實際上。通過制定大膽的策略,將復雜度的問題轉換成復雜度的問題。 從react渲染開始: 在說react虛擬dom之前我們先來看看react渲染過程,下面鏈接是根據源碼渲染過程寫的簡寫版。http://1.sharemandy.sina...
摘要:什么是虛擬在中,執行的結果得到的并不是真正的節點,結果僅僅是輕量級的對象,我們稱之為。后來產出的架構模式,期望從代碼組織方式來降低維護難度。 1、什么是虛擬DOM 在React中,render執行的結果得到的并不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM。 簡單的說,其實所謂的virtual DOM就是JavaScript對象到H...
摘要:對同一層級的子節點進行處理時,會根據進行簡要的復用。二性能優化方案由于中性能主要耗費在于階段的算法,因此性能優化也主要針對算法。此時最常用的優化方案即為方法。或者直接使用,原理一致。 一、從React原理談起 react是什么? showImg(https://segmentfault.com/img/bVbcYvf?w=1140&h=384); react是用于構建用戶界面的JS框架...
摘要:對同一層級的子節點進行處理時,會根據進行簡要的復用。或者直接使用,原理一致。 一、從React原理談起 react是什么? showImg(https://segmentfault.com/img/bVbcYvf?w=1140&h=384); react是用于構建用戶界面的JS框架。因此react只負責解決view層的渲染。 react做了什么? Virtual Dom模型 生命周期...
閱讀 2163·2021-11-12 10:36
閱讀 2156·2021-09-03 10:41
閱讀 2771·2021-08-19 10:57
閱讀 1242·2021-08-17 10:14
閱讀 1497·2019-08-30 15:53
閱讀 1218·2019-08-30 15:43
閱讀 981·2019-08-30 13:16
閱讀 2990·2019-08-29 16:56