【发布时间】:2018-08-25 20:06:56
【问题描述】:
我正在使用 coincap api 首先获取大约 1500+ 加密货币的数据,然后使用 Web-socket 更新加密货币的更新值。
我在这里使用 redux 来管理我的状态
在我的componentDidMount() 中,我正在调用 redux 操作 fetchCoin,它会获取硬币的价值
componentDidMount() {
this.props.fetchCoin()
}
然后在return 我正在做这样的事情
<FlatList
data={this.state.searchCoin ? displaySearchCrypto : this.props.cryptoLoaded}
renderItem={({ item }) => (
<CoinCard
key={item["short"]}
coinShortName = {item["short"]}
coinName = {item["long"]}
coinPrice = {item["price"].toFixed(2)}
percentChange = {item["perc"].toFixed(2)}
/>
然后我有一个网络套接字,它可以像这样更新加密货币的价值
componentDidUpdate() {
if (this.state.updateCoinData || this.updateCoinData.length < 1 ) {
this.updateCoinData = [...this.props.cryptoLoaded];
this.setState({updateCoinData: true})
}
this.socket.on('trades', (tradeMsg) => {
for (let i=0; i< this.updateCoinData.length; i++) {
if (this.updateCoinData[i]["short"] == tradeMsg.coin ) {
//Search for changed Crypto Value
this.updateCoinData[i]["perc"] = tradeMsg["message"]["msg"]["perc"]
this.updateCoinData[i]["price"] = tradeMsg['message']['msg']['price']
//Update the crypto Value state in Redux
this.props.updateCrypto(this.updateCoinData);
}
}
})
}
现在,虽然这项工作有效,但问题是这会像地狱一样减慢我的应用程序,因为每当套接字发送新数据时,它必须渲染每个组件,因此触摸和搜索等事件需要大量时间来执行。 [更新] 事实证明,即使我删除了套接字连接,我的应用仍在渲染某些内容,请查看更新 2
[问题:] 我应该怎么做才能提高应用程序的性能? (例如不使用状态或使用 DOM 来更新我的应用程序等)。
[更新 1:] 我正在使用 https://github.com/irohitb/Crypto 这两个是所有逻辑都发生的js文件 https://github.com/irohitb/Crypto/blob/master/src/container/cryptoContainer.js https://github.com/irohitb/Crypto/blob/master/src/components/CoinCard.js 我也从地图移动到平面列表。
[更新:2] 我发现在我的应用程序中发生了无休止的渲染,这可能使我的线程一直很忙(我的意思是无休止的&不必要地传递道具)。我在单独的Stackoverflow thread 上问了同样的问题,但没有得到适当的答复,而且由于它与性能有关,我想在这里放一个赏金。
请查看此帖子:infinite Render in React
[答案更新:] 虽然这里有很多很好的答案,但以防万一有人想了解它是如何工作的,您可能可以克隆我的存储库并返回 之前强>这个commit。我已经将提交与我的问题得到解决的地方联系起来(所以你可能需要回去看看我做错了什么)。此外,所有答案都非常有用且不难理解,因此您绝对应该阅读它们。
【问题讨论】:
-
有打开和关闭套接字的原因吗?您是否有机会在服务器端 API 中进行更改?
-
@BilboBaggins 不! Coincap 提供套接字连接,所以我们无法更改。打开套接字是有原因的,但是这样想,我可以消除断开连接的方法。
-
他在
componentDidUpdate中写了关于打开套接字的文章 - 问题已经在答案、cmets 和 repo 中解决(@KuchBhi 更新问题) - 但是你仍然在那里添加一个新的处理程序:P - 请参阅我的更新 -
因为我认为每次打开套接字都是开销,如果您的应用程序失去连接等,您必须这样做。此外,我认为是这样,如果只有那些自最后一次调用,如果我只能获得那些,那么我只能更新那些渲染它的组件(不是反应专家),而不是整个列表。有没有办法这样做?只是在这里大声思考。
-
你知道我刚刚读了答案 :) 我的错 .. :P
标签: reactjs react-native