Skip to content

Commit adb2962

Browse files
genkikondofacebook-github-bot
authored andcommitted
VirtualizedList optimization - refactor CellRenderer props to eliminate parentProps
Summary: Problem: All CellRenderers rerender every time the containing VirtualizedList is rerendered. This is due to the following: - Lambda is created for each CellRenderer's onLayout prop on every VirtualizedList render (fixed in D35061321 (19cf702)) - CellRenderer's parentProps prop changes on every VirtualizedList render (addressed in this diff) - FlatList recreates renderItem/ListItemComponent in FlatList._renderer Changelog: [Internal] - VirtualizedList optimization - refactor CellRenderer props to eliminate parentProps Reviewed By: javache Differential Revision: D35062323 fbshipit-source-id: 705c2f7c6c482b7813efdfdac7019a94594de590
1 parent 19cf702 commit adb2962

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

Libraries/Lists/VirtualizedList.js

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -797,12 +797,17 @@ class VirtualizedList extends React.PureComponent<Props, State> {
797797
const {
798798
CellRendererComponent,
799799
ItemSeparatorComponent,
800+
ListHeaderComponent,
801+
ListItemComponent,
800802
data,
803+
debug,
801804
getItem,
802805
getItemCount,
806+
getItemLayout,
803807
horizontal,
808+
renderItem,
804809
} = this.props;
805-
const stickyOffset = this.props.ListHeaderComponent ? 1 : 0;
810+
const stickyOffset = ListHeaderComponent ? 1 : 0;
806811
const end = getItemCount(data) - 1;
807812
let prevCellKey;
808813
last = Math.min(end, last);
@@ -817,8 +822,11 @@ class VirtualizedList extends React.PureComponent<Props, State> {
817822
<CellRenderer
818823
CellRendererComponent={CellRendererComponent}
819824
ItemSeparatorComponent={ii < end ? ItemSeparatorComponent : undefined}
825+
ListItemComponent={ListItemComponent}
820826
cellKey={key}
827+
debug={debug}
821828
fillRateHelper={this._fillRateHelper}
829+
getItemLayout={getItemLayout}
822830
horizontal={horizontal}
823831
index={ii}
824832
inversionStyle={inversionStyle}
@@ -828,10 +836,10 @@ class VirtualizedList extends React.PureComponent<Props, State> {
828836
onCellLayout={this._onCellLayout}
829837
onUpdateSeparators={this._onUpdateSeparators}
830838
onUnmount={this._onCellUnmount}
831-
parentProps={this.props}
832839
ref={ref => {
833840
this._cellRefs[key] = ref;
834841
}}
842+
renderItem={renderItem}
835843
/>,
836844
);
837845
prevCellKey = key;
@@ -1887,8 +1895,19 @@ type CellRendererProps = {
18871895
ItemSeparatorComponent: ?React.ComponentType<
18881896
any | {highlighted: boolean, leadingItem: ?Item},
18891897
>,
1898+
ListItemComponent?: ?(React.ComponentType<any> | React.Element<any>),
18901899
cellKey: string,
1900+
debug?: ?boolean,
18911901
fillRateHelper: FillRateHelper,
1902+
getItemLayout?: (
1903+
data: any,
1904+
index: number,
1905+
) => {
1906+
length: number,
1907+
offset: number,
1908+
index: number,
1909+
...
1910+
},
18921911
horizontal: ?boolean,
18931912
index: number,
18941913
inversionStyle: ViewStyleProp,
@@ -1897,22 +1916,8 @@ type CellRendererProps = {
18971916
onCellLayout: (event: Object, cellKey: string, index: number) => void,
18981917
onUnmount: (cellKey: string) => void,
18991918
onUpdateSeparators: (cellKeys: Array<?string>, props: Object) => void,
1900-
parentProps: {
1901-
// e.g. height, y,
1902-
getItemLayout?: (
1903-
data: any,
1904-
index: number,
1905-
) => {
1906-
length: number,
1907-
offset: number,
1908-
index: number,
1909-
...
1910-
},
1911-
renderItem?: ?RenderItemType<Item>,
1912-
ListItemComponent?: ?(React.ComponentType<any> | React.Element<any>),
1913-
...
1914-
},
19151919
prevCellKey: ?string,
1920+
renderItem?: ?RenderItemType<Item>,
19161921
...
19171922
};
19181923

@@ -2030,14 +2035,16 @@ class CellRenderer extends React.Component<
20302035
const {
20312036
CellRendererComponent,
20322037
ItemSeparatorComponent,
2038+
ListItemComponent,
2039+
debug,
20332040
fillRateHelper,
2041+
getItemLayout,
20342042
horizontal,
20352043
item,
20362044
index,
20372045
inversionStyle,
2038-
parentProps,
2046+
renderItem,
20392047
} = this.props;
2040-
const {renderItem, getItemLayout, ListItemComponent} = parentProps;
20412048
const element = this._renderElement(
20422049
renderItem,
20432050
ListItemComponent,
@@ -2046,10 +2053,7 @@ class CellRenderer extends React.Component<
20462053
);
20472054

20482055
const onLayout =
2049-
/* $FlowFixMe[prop-missing] (>=0.68.0 site=react_native_fb) This comment
2050-
* suppresses an error found when Flow v0.68 was deployed. To see the
2051-
* error delete this comment and run Flow. */
2052-
(getItemLayout && !parentProps.debug && !fillRateHelper.enabled()) ||
2056+
(getItemLayout && !debug && !fillRateHelper.enabled()) ||
20532057
!this.props.onCellLayout
20542058
? undefined
20552059
: this._onLayout;

0 commit comments

Comments
 (0)