React 原生性能问题

2024-01-22

我使用 coincap api 首先获取大约 1500 多种加密货币的数据,然后使用 Web-socket 来更新加密货币的更新值。

我在这里使用 redux 来管理我的状态

在我里面componentDidMount(),我正在打电话还原动作 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);

          }
        }
      })
  }

现在,虽然这项工作有效,但问题是这会减慢我的应用程序的速度,因为每当套接字发送新数据时,它都必须渲染每个组件,因此触摸和搜索等事件需要花费大量时间来执行。[Update]事实证明,即使我删除套接字连接,我的应用程序也会呈现一些内容,查看更新 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/container/cryptoContainer.js https://github.com/irohitb/Crypto/blob/master/src/components/CoinCard.js https://github.com/irohitb/Crypto/blob/master/src/components/CoinCard.js我也从地图转移到平面列表。

[更新:2]我发现有无尽的渲染发生在我的应用程序内,这可能使我的线程忙碌(我的意思是它是无止尽的和不必要的传递道具)。我在单独的地方问了同样的问题堆栈溢出线程 https://stackoverflow.com/questions/52213596/infinite-render-in-react但没有收到适当的回复,因为这与性能有关,所以我考虑在这里给予奖励。

请检查此线程:React 中的无限渲染 https://stackoverflow.com/questions/52213596/infinite-render-in-react

[答案更新:]虽然这里有很多很好的答案,但以防万一有人想了解它是如何工作的,您可以克隆我的存储库并返回before this commit https://github.com/irohitb/Crypto/commit/f395c7cda912599049d3448204a2b8a5660d6cb0。我已将提交链接到解决问题的位置(因此您可能需要返回并查看我做错了什么)。此外,所有答案都非常有用且不难理解,因此您绝对应该仔细阅读它们。


每次您的组件更新时,它都会启动一个新的套接字,这会导致内存泄漏并导致this.props.updateCrypto(updateCoinData);对于相同的数据被多次调用。这可以通过打开插座来解决componentDidMount()并将其关闭componentWillUnmount().

您还可以缓冲多个记录更新并每隔几秒一次性更改 FlatList 数据。

编辑工作示例(App.js):

import React, { Component } from 'react';
import { Text, View, FlatList } from 'react-native';
import SocketIOClient from 'socket.io-client';

type Props = {};
export default class App extends Component<Props> {
    constructor(props) {
        super(props);

        this.currencies = {};
        this.state      = {
            currenciesList: [],
        }
    }

    componentDidMount() {
        this.socket = SocketIOClient('https://coincap.io');

        this.socket.on('trades', (tradeMsg) => {
            const time = new Date();

            // Store updates to currencies in an object
            this.currencies[tradeMsg.message.msg.short] = {
                ...tradeMsg.message.msg,
                time: time.getHours() + ':' + time.getMinutes() + ':' + time.getSeconds(),
            };

            // Create a new array from all currencies
            this.setState({currenciesList: Object.values(this.currencies)})
        });
    }

    componentWillUnmount() {
        this.socket.disconnect();
    }

    render() {
        return (
            <FlatList
                data={this.state.currenciesList}
                extraData={this.state.currenciesList}
                keyExtractor={(item) => item.short}
                renderItem={({item}) => <View style={{flexDirection: 'row', justifyContent: 'space-between'}}>
                    <Text style={{flex: 1}}>{item.time}</Text>
                    <Text style={{flex: 1}}>{item.short}</Text>
                    <Text style={{flex: 1}}>{item.perc}</Text>
                    <Text style={{flex: 1}}>{item.price}</Text>
                </View>}
            />
        );
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 原生性能问题 的相关文章

随机推荐

  • 如何从 Golang 的 Slice 中删除元素

    fmt Println Enter position to delete fmt Scanln pos new arr make int len arr 1 k 0 for i 0 i lt len arr 1 if i pos new a
  • 如何获取DNS中的TTL(Time To Live)?

    我想监控 DNS 地址 我需要得到TTL 生存时间 告诉我 DNS 记录何时到期 C 中如何获取TTL Net 示例代码位于C NET DNS 查询组件 http www codeproject com Articles 12072 C N
  • 在 Unix 中删除 ANSI 颜色转义的最佳方法

    我有一个 perl 程序 它用颜色打印输出 如果我重定向文件中的输出并在 vi 中打开它 我会看到颜色特殊字符 像这样的东西 31 43mAnd this is red on yellow too 0m 从输出文件中删除此颜色字符的最佳方法
  • Controller类中session和params的区别

    我正在查看购物车的 Rails 示例 在 ApplicationController 类中我看到如下代码 class ApplicationController lt ActionController Base protect from f
  • 如何对整列使用indexOf?

    我正在创建一个带有下拉列表的列 A 列 该列表取决于同一行 G 列中的相邻值 下拉列表的内容位于另一个工作表 OE 名称 中 在其中对它们进行索引以选择值的正确列表 仅包含相关脚本和列的工作表示例如下 https docs google c
  • 字符串中的零填充数字

    我需要将单个数字 1 到 9 转换为 01 到 09 我可以想到一个办法 但它又大又丑又麻烦 我确信一定有一些简洁的方法 有什么建议 首先 你的描述有误导性 Double是浮点数据类型 您可能想在字符串中用前导零填充数字 以下代码执行此操作
  • HTTP 在 Android 模拟器中不起作用

    我尝试了多个 HTTP 类 HttpURLConnection HTTPClient和其他 但它们在模拟器中不起作用 然后我决定在我的手机上测试一下 效果很好 那么我该如何解决 Android 模拟器 HTTP 类不起作用 而浏览器可以工作
  • 为什么来自 POSTMAN 的 POST 请求返回空?

    我在邮递员中的标题如下 我的身体是这样的 在 Laravel Lumen 路线中 我像这样检查 router gt group middleware gt auth function router router gt post sales
  • 无效的设备符号 cudaMemcpyFromSymbol CUDA

    我想计算 CUDA 中数组所有元素的总和 我想出了这段代码 它编译没有任何错误 但结果始终为零 我收到了无效的设备符号cudaMemcpyFromSymbol 我无法使用 Thrust 或 Cublas 等任何库 define TRIALS
  • 在 Swing 中使用 sleep()

    public class TestFrame extends JFrame public TestFrame setBounds 10 10 500 500 setLocationRelativeTo null setDefaultClos
  • 将 Spark 作业从 Airflow 提交到外部 Spark 容器

    我有一个用 docker swarm 构建的 Spark 和气流集群 正如我所期望的 气流容器不能包含火花提交 我正在使用 github 中存在的以下图像 Spark 大数据欧洲 docker hadoop spark workbench
  • 确定有序素数对 (p, q) 的数量,使得 N = p^2+q^3 使得从 0 到 9 的每个数字都恰好出现一次

    我必须编写一个程序 可以确定素数 p q 的有序对的数量 这样当 N p 2 q 3 以十进制书写时 从 0 到 9 的每个数字只出现一次 没有前导零 我想到使用埃拉托斯特尼筛的变体 正如它所解释的那样here https www geek
  • RETEasy 客户端 + NoSuchMethodError

    我正在尝试编写简单的 RESTEasy 客户端 下面给出的是示例代码 Client client ClientBuilder newBuilder build WebTarget target client target http loca
  • 内联内容可编辑标签无法在 IE 中正确对齐

    我遇到的情况是 我有内联 contenteditable span 标签以及其他非 contenteditable 标签 这些标签在除 IE 之外的所有浏览器中都可以正常工作 在 IE 中 标签无法充当内联标签 并开始强制将自身对齐为块 某
  • 为库模块添加 rspec 测试似乎没有拾取期望和匹配器

    我正在向我的应用程序添加更多 rspec 测试 并希望测试位于 lib scoring methods rb 中的 ScoringMethods 模块 所以我添加了一个 spec lib 目录并在那里添加了 rating methods s
  • 从 Collection 更改为 SortedSet

    我正在将 Collection 更改为 SortedSet 因为我需要它始终保持与创建它们时一致的顺序 我已将模型属性从 OneToMany cascade CascadeType ALL mappedBy contentId privat
  • 如何使用 MailChimp API 发送电子邮件

    我正在 nodejs 中创建一个应用程序来使用 MailChimp 发送电子邮件 我尝试过使用https apidocs mailchimp com sts 1 0 sendemail func php https apidocs mail
  • 在 javascript/jQuery 中将字符串转换为数字

    一直在尝试将以下内容转换为数字
  • 将 dataReader 转换为字典

    我尝试使用 LINQ 将一行转换为字典 fieldName gt fieldValue return Enumerable Range 0 reader FieldCount ToDictionary
  • React 原生性能问题

    我使用 coincap api 首先获取大约 1500 多种加密货币的数据 然后使用 Web socket 来更新加密货币的更新值 我在这里使用 redux 来管理我的状态 在我里面componentDidMount 我正在打电话还原动作