Javascript React Native ListView赢得';t在排序时或检索新数据后更新

Javascript React Native ListView赢得';t在排序时或检索新数据后更新,javascript,listview,react-native,Javascript,Listview,React Native,我正在开发一个带有列表视图的react本机应用程序,用户可以对其进行排序。该应用程序每隔一段时间就会轮询一次新数据。数据是一个对象数组,从应用程序获取的一些JSON解析而来。 然而,这两种情况下,该列表实际上都不会更新 在克隆ListView.DataSource之前,我已经记录了该数组,而该数组实际上就是我所期望的。然而,数据源似乎不想更新 我已经尝试过深度克隆阵列,但没有成功 下面是一些示例代码来演示我要做的事情 初始化我的ListViewDataSource: constructor(pr

我正在开发一个带有
列表视图的react本机应用程序,用户可以对其进行排序。该应用程序每隔一段时间就会轮询一次新数据。数据是一个对象数组,从应用程序获取的一些JSON解析而来。
然而,这两种情况下,该列表实际上都不会更新

在克隆
ListView.DataSource
之前,我已经记录了该数组,而该数组实际上就是我所期望的。然而,
数据源
似乎不想更新

我已经尝试过深度克隆阵列,但没有成功

下面是一些示例代码来演示我要做的事情

初始化我的ListViewDataSource:

constructor(props) {
        super(props);
        var ds = new ListView.DataSource({
            rowHasChanged: (r1, r2) => (r1.value !== r2.value)
        });
        this.state = {
            dataSource: ds,
            sorting: 'availableCapacity',
            sortingOptions: ['name', 'availableCapacity']
        }
    }
刷新/排序数组并将其克隆到数据源 (按下按钮或拉入新数据时触发)

我尝试像这样深度克隆我的阵列,但没有成功:

cloneData(data) {
    if (data instanceof Array || data instanceof Object) {
        var newData = [];
        for (var k in data) {
            newData[k] = this.cloneData(data[k]);
        }
        return newData;
    }
    else {
        return data;
    }
}
我还尝试使用
JSON.parse(JSON.stringify(array))
对其进行深度克隆,因为数据首先是经过JSON解析的。也无济于事

有人能告诉我我做错了什么吗? 我感到非常沮丧,因为我不能做像更新ListView这样简单的事情


提前感谢。

尝试在构造函数之外定义ds变量:

var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => (r1.value !== r2.value) });
class SampleApp extends React.Component{

  constructor(props) {
    super(props)
    this.state = {
        dataSource: ds
    }
  }

  componentDidMount() {
    this.setState({ dataSource: ds.cloneWithRows(data) })
  }

  render() {
    return (
      <View style={ styles.container }>
        <ListView
        dataSource={ this.state.dataSource }
        renderRow={ (rowData) => <Text>{ rowData }</Text> }
        />
      </View>
    );
  }
}
vards=newlistview.DataSource({rowHasChanged:(r1,r2)=>(r1.value!==r2.value)});
类SampleApp扩展了React.Component{
建造师(道具){
超级(道具)
此.state={
数据源:ds
}
}
componentDidMount(){
this.setState({dataSource:ds.cloneWithRows(data)})
}
render(){
返回(
{rowData}}
/>
);
}
}
建立一个基本的演示。
我解决了我的问题,真的很惭愧。 问题不在于ListView。我的手机在挂载时将数据保存到状态,但在获取新道具时不会更新数据


我只是从状态中删除了数据,并在我的单元格中使用了道具。这使它按预期工作。

您能显示列表ire数据源的初始化吗?嘿,谢谢您的回答!我在我的问题中添加了一些代码。这没有什么区别。但是感谢您的回答。另一个选项是,尝试在refreshList函数中重置您的数据源,如下所示:
this.setState({dataSource:ds.cloneWithRows(data)})
我还更新了我的代码和示例。不幸的是,这也没有做到。我假设你肯定知道数据是从api返回的?我知道。我会在ListView中替换数据时记录数据。这实际上是我所期待的数据。如果更改其排序方式,则不会更改行。但是,它背后的数据似乎确实发生了变化,因为它在单击时显示了错误的页面。
var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => (r1.value !== r2.value) });
class SampleApp extends React.Component{

  constructor(props) {
    super(props)
    this.state = {
        dataSource: ds
    }
  }

  componentDidMount() {
    this.setState({ dataSource: ds.cloneWithRows(data) })
  }

  render() {
    return (
      <View style={ styles.container }>
        <ListView
        dataSource={ this.state.dataSource }
        renderRow={ (rowData) => <Text>{ rowData }</Text> }
        />
      </View>
    );
  }
}