reactjs - 为什么大型平面列表很慢?如何使用 shouldComponentUpdate?
问题描述
我只是想确认我有这个权利。
我的理解是,没有 pureComponent 的 react native 中的长平面列表将更新列表中每个对象的状态。因此,如果您有一个水平平面列表:
array = [A, B, C, D, E]
with a horizontal flatlist rendered to look like:
A | B | C | D | E
然后,即使 AD 的状态没有任何变化,但页面 E 中的一件事发生了变化,每个页面都会被更新。
我的理解是 PureComponent 通过对数组进行浅层比较以查看是否有任何更改来克服这一点,并且只有在发生更改时,例如 E 变为 F,然后才更新该特定页面。
如果这是正确的,那么您如何克服对嵌套数组的深度更改?
例如:
array = [ [1,2,3], [4,5,6], [7,8,9] ]
在上述情况下,如果我将 array[2][2] 更改为 10 而不是 9,PureComponent 会忽略这一点,因为它只进行浅比较。所以我现在在我的应用程序中所做的是 this.forceUpdate(),但我相信这会导致每个页面的重新呈现。那么我如何在没有 forceUpdate 的情况下使用 PureComponent 呢?我认为是通过shouldComponentUpdate,但是idk。请记住,我不能将数据结构更改为嵌套数组以外的其他内容。
解决方案
最好附上代码。
对于 flatlist 性能,您必须对数据进行分页,并且当用户滚动时,您需要为其提供更多数据
要更新平面列表,请使用分配 this.state 并将其数据更新为平面列表成员。
<FlatList
extraData={this.state}
/>
如果您将 PureComponent 用于您的 flatList 成员,它可能不会更新。我个人发送事件以仅更新特定成员以减少所需的更新过程,但为了快速修复,您可以将您的项目改为组件。
推荐阅读
- typo3 - TYPO3 Fluid:只有一些 HTML 标签没有在流体模板中呈现
- reactjs - React 代码拆分和一个用于新浏览器的捆绑包和一个用于旧浏览器的捆绑包
- codeigniter - 根据用户输入获取昨天的日期
- amazon-web-services - UnhandledPromiseRejectionWarning: AccessDeniedException
- firebase - There is no user record corresponding to this identifier. The user may have been deleted
- php - 尝试获取注册表项值时注册表项中的根无效
- android - 平板电脑上的 Angular 应用程序缺少互联网连接
- mysql - mysql - 相似记录的递归查询
- java - @Transactional 方法中的 Spring 事务处理 JMSTemplate
- reactjs - React 模块解析失败:意外字符“@”