改善布局性能

2024-01-25 13:13 更新

Flex為采用彈性布局的容器。容器內(nèi)部的所有子元素,會自動參與彈性布局。子元素默認(rèn)沿主軸排列,子元素在主軸方向的尺寸稱為主軸尺寸。

在單行布局場景下,容器里子組件的主軸尺寸長度總和可能存在不等于容器主軸尺寸長度的情況。例如,三個子組件的寬均為200px,容器寬為500px,當(dāng)?shù)谝粋€子組件和第二個子組件布局完成后,為了顯示第三個子組件,需要給第二個子組件和第三個子組件設(shè)置壓縮屬性flexShrink,此時第二個子組件會被再布局一次,導(dǎo)致布局效率下降。

場景一

所有子組件未設(shè)置displayPriority屬性(或displayPriority設(shè)置為默認(rèn)值1)和layoutWeight屬性(或layoutWeight設(shè)置為默認(rèn)值0)時,所有子組件先按序布局一次。

  • 第一次布局子組件主軸尺寸長度總和等于容器主軸尺寸長度,不需要二次布局。

  • 第一次布局子組件主軸尺寸長度總和小于容器主軸尺寸長度,且包含設(shè)置有效的flexGrow屬性的子組件,設(shè)置有效的flexGrow屬性的子組件會觸發(fā)二次布局,拉伸布局填滿容器。

  • 第一次布局子組件主軸尺寸長度總和大于容器主軸尺寸長度,且包含設(shè)置有效的flexShrink屬性(flex子組件默認(rèn)值為1,為有效值)的子組件,設(shè)置有效的flexShrink屬性的子組件會觸發(fā)二次布局,壓縮布局填滿容器。

場景二

子組件存在設(shè)置displayPriority屬性,不存在設(shè)置layoutWeight屬性。

根據(jù)displayPriority從大到小順序,布局每組同displayPriority值的子組件,直到子組件主軸尺寸長度總和最大且不超過容器主軸尺寸長度,舍棄未布局的低優(yōu)先級displayPriority(可能存在一組臨界displayPriority值的子組件布局但未使用的情況)。

  • 第一次布局子組件主軸尺寸長度總和等于容器主軸尺寸長度,不需要二次布局。

  • 第一次布局子組件主軸尺寸長度總和小于容器主軸尺寸長度,且包含設(shè)置有效的flexGrow屬性的子組件,設(shè)置有效的flexGrow屬性的子組件會觸發(fā)二次布局,拉伸布局填滿容器。

場景三

子組件中存在設(shè)置layoutWeight屬性。

根據(jù)displayPriority從大到小順序,對設(shè)置displayPriority相同值的子組件且不設(shè)置layoutWeight屬性的子組件進(jìn)行布局,直到子組件主軸尺寸長度的總和最大且不超過容器主軸尺寸長度。如果子組件主軸尺寸長度的總和超過了容器主軸尺寸長度,舍棄未布局的低優(yōu)先級displayPriority,可能存在一組臨界displayPriority值的子組件布局但未使用的情況。

剩余空間按設(shè)置layoutWeight屬性的子組件的layoutWeight比例填滿容器。

  • 兩次遍歷都只布局一次組件,不會觸發(fā)二次布局。

如何優(yōu)化Flex的布局性能

  • 使用Column/Row代替Flex。
  • 大小不需要變更的子組件主動設(shè)置flexShrink屬性值為0。
  • 優(yōu)先使用layoutWeight屬性替代flexGrow屬性和flexShrink屬性。
  • 子組件主軸長度分配設(shè)置為最常用場景的布局結(jié)果,使子組件主軸長度總和等于Flex容器主軸長度。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號