React Native列表滚动卡顿怎么优化?
我在用FlatList渲染一个商品列表,数据大概有200条左右,但一滚动就明显卡顿,FPS掉得很厉害。已经加了keyExtractor和initialNumToRender,还是没改善。
是不是 renderItem 里组件太重了?我里面用了Image和Text,还套了几层View。下面是我现在的写法:
const renderItem = ({ item }) => (
<View style={{ padding: 16 }}>
<Image source={{ uri: item.image }} style={{ width: 80, height: 80 }} />
<Text>{item.title}</Text>
<Text>{item.price}</Text>
</View>
);
有没有什么办法能让列表滑动更流畅?比如该不该用React.memo或者优化图片加载?
先说最直接有效的方案:用 React.memo 包装你的 Item 组件。
const ListItem = React.memo(({ item }) => (
));
const renderItem = ({ item }) =>
这样只有 item 的引用变化时才重新渲染,避免了每次滚动都触发 renderItem。
然后图片这块,如果你没做缓存处理,Image 组件每次渲染都会发起请求。生产环境建议用 react-native-fast-image 这个库,它带磁盘缓存,比原生 Image 强太多。
const ListItem = React.memo(({ item }) => (
style={{ width: 80, height: 80 }}
/>
));
还有几个 FlatList 的参数可以调一下:
renderItem={renderItem}
keyExtractor={item => item.id}
getItemLayout={(data, index) => ({
length: 112, // 你的item高度
offset: 112 * index,
index,
})}
maxToRenderPerBatch={10}
windowSize={10}
removeClippedSubviews={true}
/>
getItemLayout 是最重要的,加上这个 FlatList 就不用每次算高度了,能提升明显。maxToRenderPerBatch 和 windowSize 控制渲染批次,可以减少首屏渲染压力。
至于你问的该不该用 memo,答案是:该用。只要你的 Item 组件是独立的,都建议用 memo 包一下。200条数据本身不大,优化完应该能跑满60fps。