Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何使用socket.io数据更新ListView?_Reactjs_React Native - Fatal编程技术网

Reactjs 如何使用socket.io数据更新ListView?

Reactjs 如何使用socket.io数据更新ListView?,reactjs,react-native,Reactjs,React Native,我在React Native中工作,从API中像普通一样获取数据,然后用它生成一个ListView。这很有效。然后我使用socket.io获取更新的交易数据。这也是可行的,然后我有了tradeMsg,它是一个对象,其中的数据与dataSource对象的外观相匹配。当我尝试更新数据源,以便ListView动态更新与tradeMsg匹配的部分时,问题就出现了。这里有关于代码应该是什么样子的想法吗?这是我的代码(我标记了可能需要调整的部分): componentDidMount(){ //Socke

我在React Native中工作,从API中像普通一样获取数据,然后用它生成一个ListView。这很有效。然后我使用socket.io获取更新的交易数据。这也是可行的,然后我有了tradeMsg,它是一个对象,其中的数据与dataSource对象的外观相匹配。当我尝试更新数据源,以便ListView动态更新与tradeMsg匹配的部分时,问题就出现了。这里有关于代码应该是什么样子的想法吗?这是我的代码(我标记了可能需要调整的部分):

componentDidMount(){
//Socket.io部件
常量套接字=io.connect('http://socket.coincap.io“,{传输:['websocket']})
socket.on('trades',函数(tradeMsg){
//这部分可能需要调整
让ds=newListView.DataSource({rowHasChanged:(r1,r2)=>r1!==r2});
这是我的国家({
数据源:ds.cloneWithRows(tradeMsg)
});
console.log('updated');
}.约束(这个);
//普通API获取部分
返回获取('http://www.coincap.io/front')
.then((response)=>response.json())
.然后((responseJson)=>{
让ds=newListView.DataSource({rowHasChanged:(r1,r2)=>r1!==r2});
这是我的国家({
孤岛加载:false,
数据源:ds.cloneWithRows(responseJson),
},函数(){
//对新国家做些什么
log('调用了基本api')
});
})
.catch((错误)=>{
控制台错误(error);
});

}
您每次都需要传递一个完整的数据集,它将使用
rowHasChanged
函数来确定要更改的行

因此,在fetch中,您将在调用
cloneWithRows
之前执行类似于
this.data=response.json的操作。然后在套接字侦听器中,您将创建此.data**的克隆,传入对象可以添加到克隆数组(如果是新的)中,也可以替换更新的对象(如果是更新的)。然后使用新数组调用
cloneWithRows()
,并保留对它的引用


**克隆,因为React Native ListViewDataSource没有复制传递给
cloneWithrows
的数据blob,所以您不想对其进行变异您需要传递
.cloneWithrows()
每次一个完整的数据集——它将使用
rowHasChanged
函数进行差异,以确定要更改的行

因此,在fetch中,您将在调用
cloneWithRows
之前执行类似于
this.data=response.json的操作。然后在套接字侦听器中,您将创建此.data**的克隆,传入对象可以添加到克隆数组(如果是新的)中,也可以替换更新的对象(如果是更新的)。然后使用新数组调用
cloneWithRows()
,并保留对它的引用


**克隆,因为React Native ListViewDataSource没有复制传递给
cloneWithrows
的数据blob,所以您不想对其进行变异

有什么问题?您收到的是错误消息还是不是您期望的行为?我的列表视图从600个部分变为只有一个空部分。我的尝试显然是错误的。我想我需要在dataSource中编辑数据,但不知道如果下面的答案不是你想要的,那么最好对它进行适当的评论,或者扩展你的问题。问题是什么?您收到的是错误消息还是不是您期望的行为?我的列表视图从600个部分变为只有一个空部分。我的尝试显然是错误的。我想我需要在dataSource中编辑数据,但我不知道如果下面的答案不是你想要的,那么最好对它进行适当的评论,或者扩展你的问题。顺便说一下,你可能还想尝试一下哪个性能更好,API更简单。更新或添加到平面列表只是将数组分配给lists.data prop的问题。顺便说一句,您可能还想尝试一下哪个性能更高,API更简单。更新或添加到平面列表只是将数组分配给列表的问题。