05-3.React學習筆記.虛擬DOM(部分)

虛擬DOM的創(chuàng)建過程##

image.png
  1. 我們通過React.createElement最終創(chuàng)建出來一個ReactElement對象圈纺,函數(shù) -> 對象链沼。
    原因是React利用ReactElement對象(JS對象體現(xiàn))組成了一個JS的對象樹,JS的對象樹就是虛擬DOM沛鸵。
image.png
  1. 我們將babel轉義過的jsx語法通過控制臺輸出括勺。結果如上圖。
image.png
  1. 直接輸出jsx語法曲掰,與步驟2結果相同疾捍。
    對象層層展開,通過props.children栏妖,和我們的dom結構一致乱豆。

  2. 如何轉為真實dom。
    通過ReactDOM.render(<>,document.getElementById("app")); 函數(shù)將js對象映射到對應的app吊趾。

  3. 過程總結

       // jsx -> createElement函數(shù) -> ReactElement(對象樹) -> ReactDOM.render -> 真實dom
        // native
        // jsx -> createElement函數(shù) -> ReactElement(對象樹) -> ReactDOM.rener -> 原生控件(UIButton/Button)
  1. 為什么不直接修改真實DOM而使用虛擬DOM
  • 很難跟蹤狀態(tài)發(fā)生的改變:原有開發(fā)模式中難以跟蹤狀態(tài)改變宛裕,不易調試。(調試方式论泛,debug && 打涌)。在react工具中可以對dom狀態(tài)進行跟蹤屁奏。
  • 操作真實DOM性能較低:
    第一點:document.createElement本身創(chuàng)建出來的就是一個非常復雜的對象岩榆。
    第二點:DOM操作會引起瀏覽器的回流和重繪,性能損耗非常大。

舉個例子:一組數(shù)字[0,1,2,3,4]勇边,通過ul和li展示出來犹撒,后來又增加5條數(shù)據(jù)[0,1,2,3,4,5,6,7,8,9]。
可以通過重新遍歷數(shù)組(先移除掉)粒褒。
在ul后面追加另外5個li來重新渲染识颊,如下圖進行了5次遍歷,意味著5次dom操作怀浆,效率很低谊囚。

image.png

最好的方法:對批量的操作進行合并,比如可以通過DocumentFragment進行合并执赡。我們正是通過镰踏,先在虛擬DOM上面來更新,再將其更新渲染到真實dom上面沙合,從而解決上面問題奠伪,避免重復操作真實DOM。

React官網關于Virtual DOM的說法:
虛擬dom是編程理念首懈,UI以虛擬化的表現(xiàn)形式(相對簡單的JS對象)被保存于內存中绊率,并通過如ReactDOM.render
等類庫使虛擬DOM與真實DOM同步,這一過程叫做協(xié)調Reconciliation究履。

虛擬DOM幫我們從命令式編程轉到了聲明式編程的模式滤否,與React元素關聯(lián)在一起,都代表了用戶界面的對象最仑,而React也使用一個名為“fibers”的內部對象來存放組件樹的附加信息藐俺,兩者被認為是虛擬DOM的一部分實現(xiàn)。

元素位置改變之類都會引起重排泥彤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末欲芹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吟吝,更是在濱河造成了極大的恐慌菱父,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剑逃,死亡現(xiàn)場離奇詭異浙宜,居然都是意外死亡,警方通過查閱死者的電腦和手機蛹磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門梆奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人称开,你說我怎么就攤上這事亩钟∨依妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵清酥,是天一觀的道長扶镀。 經常有香客問我,道長焰轻,這世上最難降的妖魔是什么臭觉? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辱志,結果婚禮上蝠筑,老公的妹妹穿的比我還像新娘。我一直安慰自己揩懒,他們只是感情好什乙,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著已球,像睡著了一般臣镣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上智亮,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天忆某,我揣著相機與錄音,去河邊找鬼阔蛉。 笑死弃舒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的状原。 我是一名探鬼主播棒坏,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遭笋!你這毒婦竟也來了?” 一聲冷哼從身側響起徒探,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓦呼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后测暗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體央串,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年碗啄,在試婚紗的時候發(fā)現(xiàn)自己被綠了质和。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稚字,死狀恐怖饲宿,靈堂內的尸體忽然破棺而出厦酬,到底是詐尸還是另有隱情,我是刑警寧澤瘫想,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布仗阅,位于F島的核電站,受9級特大地震影響国夜,放射性物質發(fā)生泄漏减噪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一车吹、第九天 我趴在偏房一處隱蔽的房頂上張望筹裕。 院中可真熱鬧,春花似錦窄驹、人聲如沸朝卒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎运。三九已至,卻和暖如春饮戳,著一層夾襖步出監(jiān)牢的瞬間豪治,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工扯罐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留负拟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓歹河,卻偏偏與公主長得像掩浙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秸歧,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354