React 核心技術 —— 虛擬DOM(Virtual DOM)
在前端開發的過程中,我們經常會做的一件事就是將變化的數據實時更新到UI上,這時就需要對DOM進行更新和重新渲染,而頻繁的DOM操作通常是性能瓶頸產生的原因之一,有時候我們會遇到這樣一種尷尬的情況:比如有一個列表數據,當用戶執行刷新操作時,Ajax會重新從后台請求數據,即使新請求的數據和上次完全相同,DOM也會被全部更新一遍並進行重新渲染,這樣就產生了不必要的性能開銷。
React為此引入了虛擬DOM(Virtual DOM)機制:對於每一個組件,React會在內存中構建一個相對應的DOM樹,基於React開發時所有的DOM構造都是通過虛擬DOM進行,每當組件的狀態發生變化時,React都會重新構建整個DOM數據,然后將當前的整個DOM樹和上一次的DOM樹進行對比,得出DOM結構變化的部分(Patchs),然后將這些Patchs 再更新到真實DOM中。整個過程都是在內存中進行,因此是非常高效的。借用一張圖可以清晰的表示虛擬DOM的工作機制:

React 生命周期
React 把每個組件都當作一個狀態機來維護和管理,因此每個組件都擁有一套完整的生命周期,大致可以分為三個過程:初始化、更新和銷毀。生命周期的每一個過程都明確的反映了組件的狀態變化。對於開發來說就能很容易的把握組件的每個狀態,不同的狀態時期做對應的事情,互不干擾。
更新
props屬性是只讀的,如果想要改變props的值,只能通過重新調用render()來傳遞新的props,但要注意的是,重新執行render()組件不會被重新掛載,而是通過虛擬DOM技術進行增量更新和渲染,這時還會觸發 componentWillReceiveProps 方法,並將新的props作為參數傳遞,你可以在這里對新的props進行處理。
相比props,state天生就是用來反映組件狀態的,因此它的值是可以被改變的,當state的值被改變時,通過setState就可以改變state的值,React同樣也是采用虛擬DOM技術來計算需要被更新的部分,而不是牽一發動全身的更新和渲染。
當 props 和 state 的狀態發生變化后,組件在即將更新之前還會觸發一個叫 shouldConponentUpdate 的方法,如果 shouldConponentUpdate 返回的是 true,不管props和state 的值和上一次相比有沒有變化,React 都會老老實實的進行對比。此時,如果你確定以及肯定兩次數據沒有變化,那就讓 shouldConponentUpdate 返回 false,React就不會進行diff了,更不會重新渲染了。瞬間省去了diff的時間。
銷毀
當組件從DOM中被移除時,React會銷毀之。在銷毀之前,細心的React還觸發 componentWillUnmount 來通知你,看你最后有沒有什么話想對這個即將銷毀的組件說,當然你沒什么事就不用了。
什么時候用props,什么時候用state
我們已經知道可以通過props和state兩種方式向組件傳遞數據,props是只讀的不能被改變,而 state 是用來反映一個組件的狀態,是可以改變的。因此,當組件所需要的數據在調用時是已經確定的,不頻繁發生變化的,就可以使用props來傳遞,相反,當組件所需要的數據在調用時不能確定,需要等待異步回調時才能確定,比如ajax請求數據,input的onchange事件,這時就需要使用state來記錄和改變這些值得變化
