hel*_*eer 3 javascript react-native react-native-flatlist
我正在构建多个选择模式。当用户按下该项目时,该项目应标记为“已检查”。
问题我从 id 数组中添加/删除了 id。当我打开并检查模态时,它没有显示“检查”标志。但是当我再次关闭并打开模态时,它显示“检查”标志。
为了跟踪所选项目,我在模态组件的状态中定义了这些项目。
state = {
selectedSeasonIds: this.props.selectedSeasonIds,
}
Run Code Online (Sandbox Code Playgroud)
这是我用来在屏幕上显示模态的 react-native-modal
<Modal
isVisible={isSelectorVisible}
onBackdropPress = {() => this.props.hideSelector()}>
<View style={styles.modalContainer}>
<FlatList
style={styles.root}
data={this.props.items}
ItemSeparatorComponent={this._renderSeparator}
keyExtractor={this._keyExtractor}
renderItem={this._renderItemForMultiple}/>
</View>
</Modal>
Run Code Online (Sandbox Code Playgroud)
这是每个项目的渲染功能
_renderItemForMultiple = ({item}) => {
return (
<TouchableOpacity
style={styles.itemStyle}
onPress={() => {this._handleMultipleItemPress(item.id)}}>
<RkText>{item.value}</RkText>
{ this._renderCheck(item.id) } <<< Here is the problem
</TouchableOpacity>
);
}
Run Code Online (Sandbox Code Playgroud)
当用户单击该项目时,FlatList 的项目调用 _handleMultipleitemPress
_handleMultipleItemPress = (id) => {
let { selectionType } = this.props;
let { selectedSeasonIds, selectedSizeIds, selectedColorIds } = this.state;
if(selectionType===2) {
if(_.includes(this.state.selectedSeasonIds, id)) {
let newSelectedSeasonIds = _.filter(this.state.selectedSeasonIds, (curObject) => {
return curObject !== id;
});
this.setState({selectedSeasonIds : newSelectedSeasonIds});
} else {
let newSelectedSeasonIds = [...this.state.selectedSeasonIds, id];
this.setState({selectedSeasonIds : newSelectedSeasonIds});
}
}
// season Select Action
this.props.seasonSelectAction(id);
}
Run Code Online (Sandbox Code Playgroud)
问题我们从 id 数组中添加/删除了 id。当我打开并检查模态时,它没有显示“检查”标志。但是当我再次关闭并打开模态时,它显示“检查”标志。
即使我们setState在renderCheck(). 为什么会发生?我该如何解决?
_renderCheck = (id) => {
let { selectionType, selectedSeasonIds, selectedSizeIds, selectedColorIds } = this.props;
if(selectionType===2) {
if(_.includes(this.state.selectedSeasonIds, id)) {
return (<RkText>Check </RkText>);
}
}
return (<RkText> </RkText>);
}
Run Code Online (Sandbox Code Playgroud)
任何其他建议也将不胜感激!感谢您阅读这篇文章。
更新我用代码调试,当我按下该项目时,它没有通过_renderItemForMultiple。我认为这是因为我没有为_renderItemForMultiple. 如何将项目传递给它的参数?任何的想法?
即使您的状态发生了变化,您也不会将<FlatList>其传递给,因此它的道具不会改变。当它的 props 没有改变时,它的shouldComponentUpdate方法返回false。正如文档所述:
通过传递
extraData={this.state}给FlatList我们确保FlatList自己会在state.selected更改时重新渲染。如果没有设置这个道具,FlatList就不会知道它需要重新渲染任何项目,因为它也是一个PureComponent并且道具比较不会显示任何变化。
所以你需要传递extraData={this.state}给FlatList.
| 归档时间: |
|
| 查看次数: |
3175 次 |
| 最近记录: |