成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何從React渲染流程分析Diff算法-創(chuàng)新互聯(lián)

這篇文章主要介紹了如何從React渲染流程分析Diff算法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

站在用戶的角度思考問題,與客戶深入溝通,找到中山網(wǎng)站設(shè)計與中山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋中山地區(qū)。

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

1、什么是虛擬DOM

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

簡單的說,其實所謂的virtual DOM就是JavaScript對象到Html DOM節(jié)點的映射;即使用JavaScript對象將Html結(jié)構(gòu)表示出來,而這個對象就是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生命周期圖

如何從React渲染流程分析Diff算法

前面提到:render執(zhí)行的結(jié)果得到的并不是真正的DOM節(jié)點,結(jié)果僅僅是輕量級的JavaScript對象,即在render函數(shù)調(diào)用時將會創(chuàng)建出虛擬DOM;

class Tab extends React.Component {
 render() {
 React.createElement(
  'p',
  { className: 'class'},
  'Hello React'
 )
 }
}

如何從React渲染流程分析Diff算法

通過React.createElemen創(chuàng)建出虛擬DOM,而該函數(shù)只在Render函數(shù)中調(diào)用,所以在React裝載和更新的過程中才會有虛擬DOM的生成;至于掛載到真實DOM自然而然是ReactDom.render函數(shù)啦。

3、virtual DOM如何實現(xiàn)

實現(xiàn)其實很簡單,主要是定義一個函數(shù)并把我們傳進去的參數(shù)組成一個React元素對象,而type就是我們傳進去的組件類型,可以是一個類、函數(shù)或字符串(如'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;
};

打印出組件:

如何從React渲染流程分析Diff算法

4、為什么需要使用virtual DOM

DOM管理歷史階段:

  1. JS 或者 jQuery 操作 DOM: 當(dāng)應(yīng)用程序越來越復(fù)雜,需要在JS里面維護的字段也越來越多,需要監(jiān)聽事件和在事件回調(diào)用更新頁面的DOM操作也越來越多,應(yīng)用程序會變得非常難維護。

  2. 后來產(chǎn)出 MVC、MVP 的架構(gòu)模式,期望從代碼組織方式來降低維護難度。但是 MVC 架構(gòu)并沒辦法減少維護的狀態(tài),也沒有降低狀態(tài)更新時需要對頁面的更新操作,你需要操作的DOM還是需要操作,只是換了個地方。

  3. 既然狀態(tài)改變了要操作相應(yīng)的DOM元素,為什么不做一個東西讓視圖和狀態(tài)進行綁定,狀態(tài)變更了視圖自動變更。這就是后來人們想出了 MVVM 模式,只要在模版中聲明視圖組件是和什么狀態(tài)進行綁定的,雙向綁定引擎就會在狀態(tài)更新的時候自動更新視圖;

  4. 但MVVM雙向數(shù)據(jù)綁定并不是唯一的辦法,還有一個非常直觀的方法:一旦狀態(tài)發(fā)生了變化,就用模版引擎重新渲染整個視圖,然后用新的視圖更換掉舊的視圖。

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何從React渲染流程分析Diff算法”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

分享名稱:如何從React渲染流程分析Diff算法-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://jinyejixie.com/article36/ghepg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、自適應(yīng)網(wǎng)站標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化ChatGPT、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
浦江县| 潍坊市| 盈江县| 杭锦旗| 宜君县| 灵台县| 五峰| 临城县| 七台河市| 淅川县| 屏东市| 夹江县| 柳江县| 唐河县| 武乡县| 巴东县| 延津县| 芮城县| 日土县| 连江县| 南郑县| 华蓥市| 交城县| 富蕴县| 建阳市| 留坝县| 枣强县| 鱼台县| 邢台县| 冀州市| 固阳县| 额尔古纳市| 大城县| 同仁县| 贺兰县| 凤冈县| 甘孜县| 兴义市| 隆子县| 丽江市| 通山县|