Я использую React Native FlatList для отображения данных в строке.Ниже приведен мой код.
HomeScreen.js
render() {
return (
<View
style={styles.container}
onLayout={this.onLayout.bind(this)}>
<Spinner visible={this.state.isShowSpinner} animation="fade" color={APP_THEME_COLOR} />
<View style={styles.subContainerStyle}>
{facetWebView}
<AnimatedFlatList
style={styles.flatListStyle}
ref={flatListRef => this.templateFlatList = flatListRef}
data={this.state.templatePosts}
renderItem={({item}) => this.renderCellItem(item)}
/>
</View>
</View>
}
renderCellItem(item, index) {
return (
<TemplateCell
item={item}
index={index}
isPortraitMode={this.state.isPortraitMode}
didSelectItemFromCell={(item) => {
this.didSelectItemFromCell(item)
}}
/>
)
}
В TemplateCell я показываю статус избранного / избранного.Я написал beforeComponentUpdate в TemplateCell как
shouldComponentUpdate(nextProps, nextState) {
const isItemChanged = this.props.item != nextProps.item
const isPortraitMode = this.props.isPortraitMode != nextProps.isPortraitMode
return isItemChanged || isPortraitMode
}
But still it is rendering the cell again. How can I avoid this.
. Я обнаружил, что в ссылке https://codeburst.io/when-to-use-component-or-purecomponent-a60cfad01a81
Никогда не MUTATE Вы, вероятно, слышали, чтобы не изменять объекты и массивы в реквизитах и состоянии.Если бы вы изменяли объекты в родительском компоненте, ваши «чистые» дочерние компоненты не обновлялись бы.Хотя значения изменились в восходящем направлении, дочерний элемент сравнивал бы ссылку с предыдущими реквизитами и не обнаруживал бы различий.
Я считаю, что мой массив является изменяемым, поэтому изменения, выполненные объектом item, остаются такими же в props и nextProps,Как этого избежать