亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

淺談從React渲染流程分析Diff算法

2019-11-19 12:59:20
字體:
來源:轉載
供稿:網友

React中最神奇的部分莫過于虛擬DOM,以及其高效的Diff算法。這讓我們可以無需擔心性能問題而”毫無顧忌”的隨時“刷新”整個頁面,由虛擬DOM來確保只對界面上真正變化的部分進行實際的DOM操作。React在這一部分已經做到足夠透明,在實際開發中我們基本無需關心虛擬DOM是如何運作的。然而,理解其運行機制不僅有助于更好的理解React組件的生命周期,而且對于進一步優化React程序也會有很大幫助。

1、什么是虛擬DOM

在React中,render執行的結果得到的并不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM。

簡單的說,其實所謂的virtual DOM就是JavaScript對象到Html DOM節點的映射;即使用JavaScript對象將Html結構表示出來,而這個對象就是virtual DOM。

eg:

Html:

<ul id='list'> <li class='item'>Item 1</li> <li class='item'>Item 2</li></ul>

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函數啦。

3、virtual DOM如何實現

實現其實很簡單,主要是定義一個函數并把我們傳進去的參數組成一個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管理歷史階段:

  1. JS 或者 jQuery 操作 DOM: 當應用程序越來越復雜,需要在JS里面維護的字段也越來越多,需要監聽事件和在事件回調用更新頁面的DOM操作也越來越多,應用程序會變得非常難維護。
  2. 后來產出 MVC、MVP 的架構模式,期望從代碼組織方式來降低維護難度。但是 MVC 架構并沒辦法減少維護的狀態,也沒有降低狀態更新時需要對頁面的更新操作,你需要操作的DOM還是需要操作,只是換了個地方。
  3. 既然狀態改變了要操作相應的DOM元素,為什么不做一個東西讓視圖和狀態進行綁定,狀態變更了視圖自動變更。這就是后來人們想出了 MVVM 模式,只要在模版中聲明視圖組件是和什么狀態進行綁定的,雙向綁定引擎就會在狀態更新的時候自動更新視圖;
  4. 但MVVM雙向數據綁定并不是唯一的辦法,還有一個非常直觀的方法:一旦狀態發生了變化,就用模版引擎重新渲染整個視圖,然后用新的視圖更換掉舊的視圖。

React采用的就是第四種模式;但是我們都知道對于操作DOM成本太高,而相對操作JavaScript就快速多了,而Html DOM可以很簡單的用JavaScript對象表示出來(Virtual DOM就這樣誕生了)

這樣的做法會導致很多的問題,最大的問題就是這樣做會很慢,因為即使一個小小的狀態變更都要重新構造整棵 DOM,性價比太低;而React Virtual DOM在狀態更新過程加了一些特別的操作來避免整棵 DOM 樹變更(它就是接下來的Diff算法)。

接下來的Diff算法即將更新,敬請期待~~~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97av在线视频免费播放| 亚洲精品二三区| 久久99视频精品| 国产日韩精品入口| 日韩在线观看免费高清| 亚洲人成网站777色婷婷| 5278欧美一区二区三区| 精品成人乱色一区二区| 日韩经典一区二区三区| 亚洲精品一区二三区不卡| 韩国视频理论视频久久| 久热99视频在线观看| 成人女保姆的销魂服务| 欧美裸体男粗大视频在线观看| 欧美在线观看www| 91av在线视频观看| 国产成人精品在线播放| 精品日韩中文字幕| 最好看的2019的中文字幕视频| 国产精品久久久久久久久久三级| 欧美亚洲另类视频| 96pao国产成视频永久免费| 成人在线中文字幕| 高清欧美性猛交xxxx黑人猛交| 欧美大片免费观看| 亚洲片av在线| 精品高清美女精品国产区| 九九精品视频在线| 日本久久久久久久久| 久久精品一偷一偷国产| 欧美裸体视频网站| 久久精品国产亚洲7777| 欧美日韩亚洲视频一区| 亚洲高清福利视频| 日韩av在线精品| 欧美高清在线视频观看不卡| 少妇高潮久久久久久潘金莲| 欧美性xxxx极品高清hd直播| 成人免费网站在线| 亚洲高清不卡av| 亚洲图中文字幕| yw.139尤物在线精品视频| 91精品久久久久久久久不口人| 欧美日韩在线看| 国产精品91免费在线| 国内精品中文字幕| 性色av一区二区三区在线观看| 成人h片在线播放免费网站| 国产成人一区二区三区| 久久99久久99精品中文字幕| 国产精品91久久久久久| 韩国19禁主播vip福利视频| 久久躁日日躁aaaaxxxx| 亚洲一区国产精品| 日韩中文av在线| 日韩亚洲第一页| 久久在线免费视频| 日韩在线精品一区| 欧美激情videos| 亚洲第一偷拍网| 亚洲黄页视频免费观看| 国产精品久久久久久久久久新婚| 永久免费精品影视网站| 亚洲欧美中文日韩v在线观看| 热久久免费视频精品| 久久久国产视频91| 久久九九全国免费精品观看| 日韩在线视频国产| 欧美国产高跟鞋裸体秀xxxhd| 97国产精品视频人人做人人爱| 国产美女久久精品香蕉69| 国产成人一区二区三区电影| 亚洲性线免费观看视频成熟| 国产精品视频公开费视频| 九九热最新视频//这里只有精品| 国产精品网站大全| 欧美多人爱爱视频网站| 日韩在线精品视频| 欧美日韩ab片| www.日本久久久久com.| 久久成人国产精品| 国产欧美日韩综合精品| 日韩av手机在线观看| 欧美激情三级免费| 国产色综合天天综合网| 欧美成人精品不卡视频在线观看| 国产精品免费网站| 国产一区红桃视频| 亚洲a在线观看| 久久亚洲一区二区三区四区五区高| 日本亚洲精品在线观看| 日韩欧美福利视频| 久久视频免费观看| 最近2019中文字幕在线高清| 国产视频亚洲视频| 亚洲精品久久久久中文字幕二区| 国内伊人久久久久久网站视频| 伊人一区二区三区久久精品| 大荫蒂欧美视频另类xxxx| 日韩精品福利网站| 欧美精品久久久久a| 在线视频中文亚洲| 国产日韩在线免费| 亚洲国产精品成人av| 国产精品成人品| 亚洲一区二区三区777| 亚洲天堂男人的天堂| 亚洲成年人影院在线| 欧美电影在线免费观看网站| 色妞色视频一区二区三区四区| 精品国产老师黑色丝袜高跟鞋| 欧美风情在线观看| 成人免费在线视频网站| 成人在线视频网站| 国内精品久久久久影院优| 国产精品久久91| 亚洲国产精品人久久电影| 神马久久桃色视频| 亚洲国产精品高清久久久| 国产69久久精品成人看| 久久成人精品视频| 中文字幕久久亚洲| 91免费福利视频| 亚洲区bt下载| 综合网日日天干夜夜久久| 黑人与娇小精品av专区| 91久久精品视频| 亚洲精品久久久久中文字幕二区| 久久久久久亚洲精品| 国产精品成人在线| 国内精品在线一区| 永久免费毛片在线播放不卡| 2019精品视频| 欧美久久久精品| 欧美日韩激情视频| 这里只有精品久久| 国产欧美一区二区白浆黑人| 国产激情久久久久| 欧美精品久久一区二区| 日韩亚洲欧美中文在线| 亚洲性av在线| 91九色蝌蚪国产| 国产精品亚洲精品| www.xxxx精品| 欧美日韩免费看| 韩国欧美亚洲国产| 亚洲第一区第一页| 久久综合久久美利坚合众国| 九九热精品视频国产| 中文字幕国产亚洲2019| 国产大片精品免费永久看nba| 福利一区福利二区微拍刺激| 欧美精品在线网站| 欧美精品久久久久久久免费观看| 国产主播欧美精品| 久久久亚洲国产天美传媒修理工| 深夜精品寂寞黄网站在线观看| 夜夜狂射影院欧美极品| 日本精品久久久久久久| 91精品久久久久久久| 精品福利在线看| 日韩免费观看视频| 日韩亚洲成人av在线| 亚洲韩国日本中文字幕|