React Native 防止FlatList重新呈现属性已更改的屏幕外组件

jbose2ul  于 2023-03-19  发布在  React
关注(0)|答案(1)|浏览(130)

我在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重新呈现了一个值的改变,它似乎也在这些组件中这样做。
是否有办法避免这种情况,并且只重新呈现用户可见的组件?
我做了一些搜索,但这个问题似乎并没有出现太多。大多数解决方案谈论通过记忆来提高性能,但我已经这样做了,现在试图通过防止屏幕外组件的“真实的”重新呈现来提高性能。

ki1q1bka

ki1q1bka1#

尽力

const renderItem = useCallback((itemData) => (
    <Line id={itemData.item} lineIdx={itemData.index} />
),[]);

<FlatList
    contentContainerStyle={styles(styleProps).scrollCont}
    data={lineIds}
    renderItem={renderItem}
    keyExtractor={item => item}
/>

避免在renderItem上使用匿名函数以提高性能

相关问题