我在React Native TS项目中有以下FlatList
:
<FlatList
contentContainerStyle={styles(styleProps).scrollCont}
data={lineIds}
renderItem={(itemData) => (
<Row id={itemData.item} lineIdx={itemData.index} />
)}
keyExtractor={item => item}
/>
这表示一个矩阵。
用于迭代的项目是Row
组件的ID。
每一行都很复杂,因为它有子代和孙子代组件。
应用程序具有复杂的状态,因此我使用Redux来运行它。
每个行都有几个Cell组件作为子级。每个Cell都有一个CellText组件作为唯一的子级。
当用户按下矩阵中的任何单元格时,所有其他单元格中的文本都将变灰。
这是如何在CellText中使用redux中的useSeletor完成的:
导出默认备忘录(函数CellText({ highlightEn,text}:单元格文本属性){
const highlightAny: boolean = useSelector<RootState, boolean>(state => state.mat.highlightAny);
const styleProps: CellTextStyleProps = { highlightEn: highlightEn, highlightAny: linehighlightAny }
styleProps随后被传递给样式组件,如果按下除其自身之外的任何其他单元格,则该样式组件将使文本变灰。
这意味着,如果用户按下第一个单元格,我们将呈现矩阵中的 * 所有 * 其他单元格,以使其文本变灰,这非常慢。这也是不必要的,因为大多数变灰的单元格都不在屏幕上。
我已经添加了一个打印,看看什么渲染时,我按:控制台日志(rendering cell ${text} in row ${rowIdx}
)
每次我按下一个单元格,矩阵中的所有单元格文本都会重新呈现。FlatList
,看起来,* 确实 * 重新呈现了属性已经改变的组件,即使这些组件当前不在屏幕上。据我所知,useSelector,triggeres重新呈现了一个值的改变,它似乎也在这些组件中这样做。
是否有办法避免这种情况,并且只重新呈现用户可见的组件?
我做了一些搜索,但这个问题似乎并没有出现太多。大多数解决方案谈论通过记忆来提高性能,但我已经这样做了,现在试图通过防止屏幕外组件的“真实的”重新呈现来提高性能。
1条答案
按热度按时间ki1q1bka1#
尽力
避免在renderItem上使用匿名函数以提高性能