如何在应用程序本身中进行昂贵的操作,如在react native中的大列表中搜索



我有一个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

相关内容

最新更新