天天看點

【javascript】關于react的Virtual DOM 與資料更新

一,關于Virtual DOM

        真實的頁面對應一個DOM樹,傳統的互動就是 DOM樹 觸發事件 -> 然後業務處理 ->操縱dom樹。操作DOM性能消耗大,且繁瑣,維護成本高。

【javascript】關于react的Virtual DOM 與資料更新

        于是 React把真實的DOM樹轉換成Javascript對象樹,也就是Virtual DOM(我覺得可以表述成這樣,不直接操作DOM,将DOM抽象成一個javascript對象樹【dom元素可以表示成一個JS對象】,操作對象樹更加友好)。使用者不直接操縱DOM,通過Vitual DOM 去改變DOM。

【javascript】關于react的Virtual DOM 與資料更新

        說這樣提升了性能,提升在哪裡了呢?資料更新之後,就是APP(代表着我們的react APP或者Vue APP)包含的資料發生變化之後,React會去對這個對象樹即Virtual DOM 與上一次做對比,對發生變化的部分做批量更新,這一步可以提升性能,React的生命周期方法shouldComponentUpdate也給我們提供了是否更新這個元件的入口。

二,資料更新(對比Vue)

        React裡面,比如一個父元件A 裡面有子元件 B/C/D ,隻要父元件A裡面state(或者取自store,po主自己加的)裡面的資料或者傳遞給子元件的props發生了變化,就會從新渲染整個元件樹,A->B / C / D 就算改變的隻是傳遞給B的資料,也會渲染整個元件樹。

        這一點其實不太友好,但是我們可以通過shouldComponentUpdate來進行判斷,這個方法接收需要更新的props和state,讓開發者自己判斷是否資料發生了變化,如果發生了變化,則繼續往下執行->componentWillUpdate->render->componentDidUpdate. 如果沒有發生變化的話,則可以return false,這樣就不再向下執行生命周期方法了。但是這樣我們每一個子元件都需要去判斷這個方法,略繁瑣。

        Vue裡面,這一點比較友好,底層本身幫我們做了這一層檢測,相當于内部實作了這個componentShouldUpdate方法,如果父元件A的data或者mutation裡面的資料發生了變化,但是隻是與B相關,那麼vue會自動re-render B元件,其他的C/D元件不會被從新渲染。當然你如果想通過資料變化做一些額外的操作,在B元件裡面watch這個資料的變化,即可。

資料:《深入React技術棧》 1.1.2 / 1.5.2章節

繼續閱讀