react入門系列之虛擬DOM

什么是虛擬DOM

react數(shù)據(jù)變化頁面同步渲染的邏輯屁使,這里分析三種邏輯在岂。

  1. 先有數(shù)據(jù) (state)
  2. 模版(render中的jsx)
  3. 數(shù)據(jù) + 模版 = 生成真實(shí)Dom,來顯示
  4. state 發(fā)生改變
  5. 數(shù)據(jù) + 模版 = 生成真實(shí)Dom蛮寂,替換原有的DOM
  • 缺陷: 第一次生成真實(shí)dom蔽午,第二次又生成一個。最后替換酬蹋。非常耗性能及老。
  • 原因: 生成一個完整的dom,和替換一個完整的dom范抓,非常耗性能骄恶。并不是每次數(shù)據(jù)變化dom的所有內(nèi)容都要變。
  1. 先有數(shù)據(jù) (state)
  2. 模版(render中的jsx)
  3. 數(shù)據(jù) + 模版 = 生成真實(shí)Dom匕垫,來顯示
  4. state 發(fā)生改變
  5. 數(shù)據(jù) + 模版 = 生成真實(shí)Dom僧鲁,并不直接替換原始的DOM
  6. 新舊DOM做對比,找差異。注意新的DOM其實(shí)是DoucumentFragment: 文檔碎片并沒有真實(shí)的掛載到頁面上寞秃。
  7. 找出input框發(fā)生變換
  8. 只用新DOM中的input元素斟叼,替換掉老的DOM中的input元素。
  • 缺陷: 節(jié)約了完整dom替換的性能春寿,但是消耗了對比的性能朗涩。效果不明顯。
  1. 先有數(shù)據(jù) (state)
  2. 模版(render中的jsx)
  3. 數(shù)據(jù) + 模版 = 生成虛擬DOM(生成虛擬DOM是一個js對象绑改,用它來描述真是DOM)(損耗性能非常行淮病)
    1. ['div', {id: 'abc'}, ['span', {}, 'hello,world']]
  4. 用虛擬DOM的結(jié)構(gòu)生成真實(shí)Dom,來顯示
    1. <div id='abc'><span>hello,world</span></div>
  5. state 發(fā)生改變
  6. 數(shù)據(jù) + 模版 = 生成新的虛擬DOM(極大提升了性能)
    1. ['div', {id: 'abc'}, ['span', {}, 'bye绢淀,bye']]
  7. 比較原始虛擬DOM和新的虛擬DOM的區(qū)別萤悴,找到區(qū)別是span中的內(nèi)容
  8. 直接操作DOM改變span中的DOM
  • 優(yōu)勢:
    1. 減少了對真實(shí)DOM的創(chuàng)建,性能提高很大
    2. js對象的比對非常不消耗性能的皆的。
  • 原因:
    1. js去生產(chǎn)一個虛擬DOM其實(shí)就是一個js對象覆履,而使用js去生成一個js對象是不怎么消耗性能的。
    2. 對比上面兩種方法费薄,不僅減少了真實(shí)DOM的生產(chǎn)硝全,同時也沒有了真實(shí)DOM的對比,虛擬DOM對比也是非常節(jié)約新能的楞抡。

深入了解虛擬DOM

  1. jsx --> createElement --> js對象(虛擬dom) --> 真實(shí)DOM
  2. jsx實(shí)際上就是一個模版伟众。
  3. react將數(shù)據(jù)和jsx模版結(jié)合通過createElement方法生成js對象,也就是虛擬dom召廷。
    • React.createElement('div', {}, 'item') // {}為div屬性
    • return <div>item</div>
    • 以上兩行代碼效果是一樣的凳厢,都是創(chuàng)建了虛擬dom
  4. 最后react再將虛擬dom生成真實(shí)dom
  5. 虛擬dom帶來的好處
    1. 性能提升:真實(shí)dom的比對變成了js對象比對
    2. 它使得跨端應(yīng)用得以實(shí)現(xiàn),React Native
      • 虛擬dom是js對象竞慢,他可以同時在原生應(yīng)用里面和瀏覽器中都能識別先紫。真實(shí)dom是不能在原生應(yīng)用識別的。
      • 在原生應(yīng)用中筹煮,我們可以使用虛擬dom轉(zhuǎn)化成原生組件遮精。這讓我們能夠開發(fā)原生應(yīng)用。

虛擬dom中的diff算法

  1. 算法運(yùn)用在比較原始虛擬DOM和新的虛擬DOM的比對中
    • 兩個虛擬dom的比對就叫diffrence算法(react底層會用到)败潦,大大提高了比對效率
  2. 什么時候會發(fā)生比對本冲。
    • 當(dāng)你調(diào)用setState()的時候,就會發(fā)生比對劫扒。
    • setState()是一個異步方法檬洞。
      1. 為什么是一個異步呢。
      2. 假設(shè)你調(diào)用了3次setState()方法沟饥。如果不是異步函數(shù)添怔,是不是要進(jìn)行3次虛擬dom比對呢环戈?所以react將它設(shè)計(jì)成異步函數(shù)。
  3. diff算法
    • 同級比較
      1. 從第一層虛擬DOM開始比較澎灸,如果差異院塞,他就不再對比,他會將第一層以及該層對應(yīng)的子節(jié)點(diǎn)都替換掉性昭。
      2. 這樣比較確實(shí)會造成渲染的浪費(fèi)拦止,因?yàn)榭赡茏庸?jié)點(diǎn)會有相同的地方。
      3. 優(yōu)勢在于比對算法簡單糜颠,他可以大大減少比對的時間汹族。
    • 為什么在我們給dom的key值賦值時候,不要使用index其兴?
      1. 首先我們要知道顶瞒,為什么我們在循環(huán)遍歷DOM的時候要給DOM設(shè)置一個key值。
      2. 每個DOM設(shè)置一個key元旬,相當(dāng)于給每個dom起了一個名字榴徐。在做虛擬dom對比的時候,我們只需要按名字對比匀归,不需要通過dom內(nèi)容現(xiàn)找到對應(yīng)的dom再進(jìn)行對比坑资,這樣就節(jié)省了新能。
      3. 為什么不能用index呢穆端?因?yàn)閕ndex不具備穩(wěn)定性袱贮,當(dāng)你刪除某一個dom后,可能你整個dom樹的key值都會發(fā)生變化体啰。
      4. 我們可以使用dom的內(nèi)容去做key攒巍,因?yàn)閮?nèi)容改變本身dom就需要重新渲染。就拿todolist來說key可以綁定value值荒勇。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柒莉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枕屉,更是在濱河造成了極大的恐慌常柄,老刑警劉巖鲤氢,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀擂,死亡現(xiàn)場離奇詭異,居然都是意外死亡卷玉,警方通過查閱死者的電腦和手機(jī)哨颂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來相种,“玉大人威恼,你說我怎么就攤上這事。” “怎么了箫措?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵腹备,是天一觀的道長。 經(jīng)常有香客問我斤蔓,道長植酥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任弦牡,我火速辦了婚禮友驮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驾锰。我一直安慰自己卸留,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布椭豫。 她就那樣靜靜地躺著耻瑟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赏酥。 梳的紋絲不亂的頭發(fā)上匆赃,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音今缚,去河邊找鬼算柳。 笑死,一個胖子當(dāng)著我的面吹牛姓言,可吹牛的內(nèi)容都是我干的瞬项。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼何荚,長吁一口氣:“原來是場噩夢啊……” “哼囱淋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐塘,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妥衣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戒傻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體税手,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年需纳,在試婚紗的時候發(fā)現(xiàn)自己被綠了芦倒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡不翩,死狀恐怖兵扬,靈堂內(nèi)的尸體忽然破棺而出麻裳,到底是詐尸還是另有隱情,我是刑警寧澤器钟,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布津坑,位于F島的核電站,受9級特大地震影響傲霸,放射性物質(zhì)發(fā)生泄漏国瓮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一狞谱、第九天 我趴在偏房一處隱蔽的房頂上張望乃摹。 院中可真熱鬧,春花似錦跟衅、人聲如沸孵睬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掰读。三九已至,卻和暖如春叭莫,著一層夾襖步出監(jiān)牢的瞬間蹈集,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工雇初, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拢肆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓靖诗,卻偏偏與公主長得像郭怪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刊橘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容