我似乎无法更新我的ListView

我有一个带拨动开关(<SegmentedControls />)的父容器。当用户单击该切换开关时,我希望子组件中的ListView使用更新的reservationListSelectedOption状态值进行更新。

我想念什么?

此处的代码:https://gist.github.com/chapeljuice/69483ab0bde13346de024d4e4a9753f0

最佳答案

实际上,在您的构造函数中设置dataSource的方式存在问题,您使用以下方法首次设置了它:new ListView.DataSource({})(此后不应该更改,因为这只是一种虚拟的东西,没有数据传递给它)

但是,稍后您使用以下命令重置该状态:dataSource: this.state.dataSource.cloneWithRows(reservationData.previous)

=>(这里有cloneWithRows,因此现在将有数据=>,这意味着this.state.dataSource“虚拟帧”本身已被更改,并且.cloneWithRows的下一次执行将失败-将不具有.cloneWithRows功能了)

======>解决方案:

我认为您可以:

在cardList.js中:

// Put the data-source ds here, which won't be changed
var ds = new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2});

class CardList extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      reservationListStatus: this.props.reservationListStatus,
      dataSource: ds.cloneWithRows(/* PUT YOUR INITIAL reservationData, OR JUST a blank array '[]' will be fine*/),
    };
  }


..及后,您只需要使用ds.cloneWithRows(YOUR_NEW_RESERVATION_DATA)(始终保持ds不变),如下所示:

  getReservationData() {
    if ( this.props.reservationListStatus === "Previous Reservations" ) {
      this.setState({
        dataSource: ds.cloneWithRows(reservationData.previous)
      })
    } else {
      this.setState({
        dataSource: ds.cloneWithRows(reservationData.current)
      })
    }
    console.log(this.state)
  }


那是您应该采取的方式,但是如果仍然无法使用,请在此处发布您遇到的一些错误,谢谢

08-15 22:13