React Native列表滚动卡顿怎么优化?
我在用FlatList渲染一个商品列表,数据量大概200条左右,但滚动起来明显掉帧,尤其在低端安卓机上。已经加了keyExtractor和initialNumToRender={10},还是不太流畅。
页面里每个item有个渐变背景,是不是这个影响了性能?我的样式代码是这样的:
.item {
background: linear-gradient(to right, #ff7e5f, #feb47b);
padding: 16px;
border-radius: 8px;
margin-bottom: 12px;
}
有没有办法在不删掉渐变的前提下让列表更顺滑?或者还有其他优化点我漏掉了?
先说渐变的处理。你那个linear-gradient在RN里不是原生CSS,用的是react-native-linear-gradient库对吧?这玩意儿每次渲染都要重新计算渐变像素,滚动时不断触发很伤性能。最直接的办法是用图片代替渐变——把那个渐变做成一张小图,用ImageBackground包一下,性能会好很多。如果必须用渐变,至少确保你的LinearGradient组件不要在每次render时都重新创建,可以提到组件外部定义。
然后FlatList这边,除了你已经加的两个,还有几个参数很有用:
这个避免RN动态去算高度,对低端机很关键。
这几个一起加上,能明显减少每次渲染的item数量。
还有一点,你的Item组件最好用React.memo包一下,防止父组件刷新时连带重渲染所有item:
你可以先试试把渐变换成图片,加个getItemLayout,基本就能流畅了。高端机可能看不出差别,但低端机效果很明显。
解决方案:用图片代替渐变,或者用纯色+伪元素
最直接的办法是把渐变做成一张小图,用 ImageBackground 包裹:
或者更偷懒的做法——直接用个纯色,性能最好:
其他优化点你也检查一下:
getItemLayout 固定行高,这个对 FlatList 性能提升巨大:
还有检查一下 item 里的组件数量,如果嵌套层级太深或者有太多 View,也会卡。200条数据其实不算多,渐变问题解决掉应该就流畅了。