我有一个10000条记录的json,我需要在平面列表中显示。我使用的是一个运行良好的虚拟列表。现在我有了一些过滤器,点击后应该过滤掉json,并用新数据重新呈现列表。我只是在过滤掉数据。
const filters = foo1;
const largeList = [{ id:1, foo:'foo1',bar:10 },{id:2, foo:'foo1',bar:20} ...]
const filteredList = largeList.filter(l=>l.foo === filters && l.bar > 10);
过滤器是动态的,这会滞后于我的应用程序,因为它会给UI线程带来压力。我使用过InteractionManager.runafterinteractions((,但在这种情况下不起作用。如何在不阻塞UI线程的情况下在应用程序中执行如此昂贵的操作?
如果您不能将过滤器委托给后端,那么获得更好性能的最佳方法是用for循环替换.filter。
网上有很多页面表明for循环比数组函数快得多。(https://javascript.plainenglish.io/are-for-loops-better-than-arrays-filter-or-foreach-methods-f54b6880d201)
此外,您需要评估Flatlist的更好配置:
removeClippedSubviews:如果为true,则视口外的视图将与本机视图层次分离。
maxToRenderPerBatch:它是一个VirtualizedList道具,可以通过FlatList传递。这控制了每个批次渲染的项目数量,即每个滚动上渲染的下一个项目块。
更新CellsBatchingPeriod:当maxToRenderPerBatch参数告诉您每个批次渲染的项目数量时,设置updateCellsBatchingPeriod参数告诉您的VirtualizedList批次渲染之间的延迟(以毫秒为单位((组件渲染窗口项目的频率(。
纯成分:对组件进行更新验证。React的PureComponent实现了一个带有浅比较的shouldComponentUpdate。这在这里很贵,因为它需要检查你所有的道具。如果您想要良好的位级性能,请为列表项组件创建最严格的规则,只检查可能更改的道具。如果你的清单足够基本,你甚至可以使用。(React.memo可能是一个很好的解决方案(
来源:https://reactnative.dev/docs/optimizing-flatlist-configuration