當前位置:吉日网官网 - 傳統美德 - React diff算法

React diff算法

react 作為壹款最主流的前端框架之壹,在設計的時候除了簡化操作之外,最註重的地方就是節省性能了。diff算法就是為 節省性能 而設計的,diff算法和虛擬DOM的完美結合是react最有魅力的地方。其中,diff 是 different 的簡寫,這樣壹來,diff 算法是什麽也就顧名思義了——找不同。

在DOM需要更新的時候,通過diff算法可以 計算出 虛擬DOM 中真正變化的部分,從而只針對變化的部分進行更新渲染,避免”牽壹發而動全身“,造成性能浪費。

雖然完美地實現了找不同的功能,但是傻瓜式的 循環遞歸對節點進行依次的對比 ,使其算法的時間復雜度為 O(n^3) ,其中n是dom樹的節點數。如果dom數足夠大的話,這個算法將對cpu形成絕殺。

為了優化diff算法,react中對普通的diff算法實行了三大策略,成功將時間復雜度降為 O(n)

tree diff 是diff算法的基礎策略,它的重點在於 同層比較

出於對diff算法的優化,react的tree diff對DOM節點的跨層級移動的操作忽略不計,react對Virtual DOM樹進行層級控制,也就是說 只對相同層級的DOM節點進行比較 (即同壹個父節點下的所有子節點)。對比時,壹旦發現節點不存在,則直接刪除掉該節點以及之下的所有子節點。這樣秩序對DOM樹進行依次遍歷,就可以完成整個樹的對比。時間復雜度為O(n)

壹個疑問:既然tree diff忽略了跨層級移動的操作,如果這種情況出現了,diff算法會怎麽處理呢?

答:不管,多了就新增,少了就刪除( 只有創建節點和刪除節點的操作 )。所以官方明確建議不要進行DOM節點的跨層級操作。

component diff是組件間的對比

在遇到組件之間的比較時,有三種策略

優化點:

element diff 是針對同壹層級的element節點的

在雙方同壹層級的節點對比時,有三種情況

子節點更新時,會出現以下幾種情況:

react中的key值,它不是給開發者使用的。在壹般情況下key值是當我們在做子元素遍歷的時候需要使用的。因為我們如果要進行數據的更新,就需要進行虛擬dom的對比,而key值就是每個元素節點對應的唯壹值。這個時候就需要對比子元素的key值是否有匹配項,如果有的情況下則會進行數據的更新;如果key值沒有匹配項,那麽這個節點就需要進行刪除和重新創建。

因此我們在遍歷的時候千萬不要用 index下標 或者 時間戳、隨機數 等進行key值的賦值。這樣會造成元素的移除重新創建浪費性能。

  • 上一篇:節前四天全國接待國內遊客多少次?
  • 下一篇:墻板的安裝步驟有哪些?墻板怎麽選?
  • copyright 2024吉日网官网