Javascript React忽略shouldComponentUpdate()中的道具更改
有时,对平面列表项使用PureComponent或Memo有助于优化平面列表性能,但有时也会导致更多性能问题。这取决于传递给列表项的道具。如果传递给列表项的道具太多,则只会恶化性能 在我的用例中,列表的主要组件有很多属性,因此我需要实现我自己的shouldComponentUpdate函数。因为我的道具不会导致重新渲染(更新),所以我需要在shouldComponentUpdate(而不是状态)中忽略它们 我试过这样的方法:Javascript React忽略shouldComponentUpdate()中的道具更改,javascript,reactjs,performance,react-native,Javascript,Reactjs,Performance,React Native,有时,对平面列表项使用PureComponent或Memo有助于优化平面列表性能,但有时也会导致更多性能问题。这取决于传递给列表项的道具。如果传递给列表项的道具太多,则只会恶化性能 在我的用例中,列表的主要组件有很多属性,因此我需要实现我自己的shouldComponentUpdate函数。因为我的道具不会导致重新渲染(更新),所以我需要在shouldComponentUpdate(而不是状态)中忽略它们 我试过这样的方法: state = { count: 0, player
state = {
count: 0,
player: {
name: "Nick"
}
}
shouldComponentUpdate(nextProps, nextState) {
return nextState !== this.state;
}
但是不起作用,因为nextState引用与this.state相同的内存(我想)
有什么办法吗
(执行,因为我遵循这些技巧来获得更好的平面列表性能)。这是我的平面列表:
keyExtractor = ({ id }) => id; // each element in the data array has an unique uuid.
<FlatList
data={data}
getItemLayout={this.getItemLayout}
keyExtractor={this.keyExtractor}
listKey={listKey}
legacyImplementation={false}
numColumns={1}
renderItem={this.renderItem}
initialNumToRender={10}
windowSize={5}
maxToRenderPerBatch={5}
updateCellsBatchingPeriod={50}
removeClippedSubviews={false}
ListFooterComponent={this.renderFooter}
ListEmptyComponent={ListEmptyComponent}
onEndReached={onEndReached}
onEndReachedThreshold={0.15}
/>
keyExtractor=({id})=>id;//数据数组中的每个元素都有一个唯一的uuid。
谢谢。这听起来很不对。您错误地找到了问题的“解决方案”,请您描述一下您的实际问题是什么(性能?),然后您会得到更好的答案。请看第8点,我正在按照这些提示来编写我的平面列表,我唯一不遵守的是这一点。例如,我有一个属性主题(来自react native paper):{colors:..},这是一个非常长的对象,我认为使用浅比较扩展react.PureComponent会影响性能。是的,第8点是有效的-当您有很多道具时,不要使用
PureComponent
或memo
。但您已将其转换为使shouldComponentUpdate对所有内容返回false,状态更改除外
,该值仅为野生值。但是如果shouldComponentUpdate仅在第一次渲染后调用,为什么忽略这些道具不好呢?这只需要调试——去掉复杂的组件,换上一个简单的组件,看看它渲染得快不快。然后一点一点地把碎片放回去,看看它什么时候开始变慢。