【學習筆記 】React?③ 虛擬DOM 和ref的使用

目錄

  • 虛擬DOM
  • ref的使用

虛擬DOM

當組件的state或者props發(fā)生改變時,render函數(shù)就會重新執(zhí)行语卤。當父組件的render函數(shù)被運行時,它的子組件的render都將被重新運行。

React渲染機制:

1.state 數(shù)據(jù)
2.JSX模版
3.數(shù)據(jù) + 模版結合粹舵,生成虛擬DOM.['div', {id: 'abc', ['span', {}, 'hello world']}]

虛擬DOM是一個JS對象

4.用虛擬DOM的結構生成真實的DOM钮孵,顯示.<div id='abc'><span>hello world</span></div>
5.當state 發(fā)生變化后
6.數(shù)據(jù) + 模版 生成新的虛擬DOM['div', {id: 'abc', ['span', {}, 'bye-bye']}]
7.比較原始虛擬DOM和新的虛擬DOM的區(qū)別,找到區(qū)別是span中的內(nèi)容(Diff算法)
8.直接操作DOM眼滤,改變span中的內(nèi)容

整個過程為:JSX -> React.createElement -> 虛擬DOM (JS 對象 )-> 真實的DOM

引入虛擬DOM的好處:

  • 性能提升巴席,從DOM比對變成了JS比對
  • 它使得跨端應用得以實現(xiàn)。React Native

虛擬DOM中的Diff算法

1.setstate為什么是異步的诅需?


setState異步.png

性能優(yōu)化漾唉,將多次setState合成一次setState,減少虛擬DOM比對堰塌。

2.Diff進行同層比對赵刑,逐層去比對,如果發(fā)現(xiàn)不同场刑,直接替換般此,其后面的子
層全部廢棄。


逐層比對.png

3.為什么做列表循環(huán)的時候要引入key值牵现?
提高虛擬DOM比對的性能铐懊,但是key值要保持穩(wěn)定,不要用index做key值

ref的使用

在react中可以使用ref來獲取dom元素施籍。

<input
    ref={(input) => {this.input=input}} 
    value={this.state.inputValue}
    onChange={this.handleInputChange}/>

handleInputChange()通過e.target獲取input的value值居扒,也可修改為const value = this.input.value

但要注意的是:
當ref和setState一起使用的時候概漱,要把操作dom的語法放在setState的第二個參數(shù)的函數(shù)里面丑慎,因為setState是異步函數(shù)。這樣就可以保證操作dom的方法是在頁面渲染后執(zhí)行的瓤摧。

    handleBtnClick () {
        this.setState((prevState) => ({
            list: [...prevState.list, prevState.inputValue],
            inputValue: ''
        }), () => {
            console.log(this.ul.querySelectorAll('div').length)
        })
    }

如果將console.log(this.ul.querySelectorAll('div').length)放在setState后面竿裂,就會出現(xiàn)下面的情況,獲取到的div總是比實際少一個照弥。

ref的使用.gif

(完)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腻异,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子这揣,更是在濱河造成了極大的恐慌悔常,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件给赞,死亡現(xiàn)場離奇詭異机打,居然都是意外死亡,警方通過查閱死者的電腦和手機片迅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門残邀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事芥挣∏疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵空免,是天一觀的道長空另。 經(jīng)常有香客問我,道長鼓蜒,這世上最難降的妖魔是什么痹换? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮都弹,結果婚禮上娇豫,老公的妹妹穿的比我還像新娘。我一直安慰自己畅厢,他們只是感情好冯痢,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著框杜,像睡著了一般浦楣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪辱,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天振劳,我揣著相機與錄音,去河邊找鬼油狂。 笑死历恐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的专筷。 我是一名探鬼主播弱贼,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磷蛹!你這毒婦竟也來了吮旅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤味咳,失蹤者是張志新(化名)和其女友劉穎庇勃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槽驶,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡责嚷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捺檬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再层。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贸铜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聂受,到底是詐尸還是另有隱情蒿秦,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布蛋济,位于F島的核電站棍鳖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碗旅。R本人自食惡果不足惜渡处,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟辟。 院中可真熱鬧医瘫,春花似錦、人聲如沸旧困。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼具。三九已至僚纷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拗盒,已是汗流浹背怖竭。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陡蝇,地道東北人痊臭。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像毅整,于是被迫代替她去往敵國和親趣兄。 傳聞我的和親對象是個殘疾皇子绽左,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 數(shù)據(jù)驅(qū)動原理 假如讓我們自己實現(xiàn)react中數(shù)據(jù)驅(qū)動視圖悼嫉,我們該怎么做呢? 一般人想到的做法是:state 數(shù)據(jù)J...
    Adoins閱讀 2,105評論 0 7
  • 什么是虛擬DOM react數(shù)據(jù)變化頁面同步渲染的邏輯拼窥,這里分析三種邏輯戏蔑。 先有數(shù)據(jù) (state) 模版(ren...
    Byhua閱讀 184評論 0 0
  • state, props,render() 為什么說React是由數(shù)據(jù)驅(qū)動的? 當組件的state或者props發(fā)...
    濱濱_57b5閱讀 264評論 0 0
  • 40鲁纠、React 什么是React总棵?React 是一個用于構建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,005評論 0 1
  • 3. JSX JSX是對JavaScript語言的一個擴展語法, 用于生產(chǎn)React“元素”改含,建議在描述UI的時候...
    pixels閱讀 2,809評論 0 24