【问题标题】:FlatList item doesn't update when I setState()当我 setState() 时 FlatList 项目不更新
【发布时间】:2018-04-10 23:28:12
【问题描述】:

我正在构建多选模式。当用户按下该项目时,该项目应标记为“已检查”。

问题我从 id 数组中添加/删除了 id。当我打开并检查模式时,它没有显示“检查”标志。但是当我再次关闭并打开模式时,它会显示“检查”标志。

为了跟踪选定的项目,我将项目定义为模态组件的状态。

  state = {
    selectedSeasonIds: this.props.selectedSeasonIds,
   }

这是我用来在屏幕上显示模态的 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>

这是每个项目的渲染函数

_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>
    );
  }

当用户点击item时,FlatList的item调用_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);
  }

问题我们从 id 数组中添加/删除了 id。当我打开并检查模式时,它没有显示“检查”标志。但是当我再次关闭并打开模式时,它会显示“检查”标志。

即使我们 setStaterenderCheck() 中,模态也不会呈现。为什么会这样?我该如何解决?

  _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>);
  }

任何其他建议也将不胜感激!感谢您阅读这篇文章。

更新我使用代码进行了调试,当我按下该项目时,它没有通过_renderItemForMultiple。我认为这是因为我没有为_renderItemForMultiple 定义参数。如何将项目传递给它的参数?有什么想法吗?

【问题讨论】:

  • 我有点忙其他事情,我想帮助你但现在不能讨论,如果你能提供这个代码的工作演示,我可以更快地调试它。
  • 感谢您帮助我解决这个问题。但是我无法使正在运行的 plankr :( 但这是个好消息,我逐行调试了代码,我发现 _renderItemForMultiple 在我 setState 时没有呈现。为什么它没有呈现?

标签: javascript react-native react-native-flatlist


【解决方案1】:

即使你的状态改变了,你也没有将它传递给&lt;FlatList&gt;,所以它的属性不会改变。它的shouldComponentUpdate 方法在其道具没有改变时返回false。正如文档所述:

通过将extraData={this.state} 传递给FlatList,我们确保FlatList 本身会在state.selected 更改时重新渲染。如果不设置此道具,FlatList 将不知道需要重新渲染任何项目,因为它也是 PureComponent,并且道具比较不会显示任何更改。

所以你需要将extraData={this.state} 传递给FlatList

【讨论】:

  • 完全正确。不过在你发帖之前我就知道了。我正在回答我自己的问题,但您提前发布了。谢谢!!
  • 也为我的问题投票。这可能对其他人非常有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2021-03-27
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多