热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

反应本机性能问题

如何解决《反应本机性能问题》经验,为你挑选了2个好方法。

我正在使用congap api来首先获取大约1500+加密货币的数据,然后使用Web-socket来更新加密货币的更新值.

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

在我的内部componentDidMount(),我正在调用一个可以获取硬币价值的redux动作 fetchCoin

componentDidMount() {
    this.props.fetchCoin()
  }

然后在return我做这样的事情

  (
           

然后我有一个web-socket来更新加密货币的价值

 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

现在,虽然这项工作,问题是这会让我的应用程序像地狱一样慢,因为每当套接字发送新数据时,它必须呈现每个组件,因此触摸和搜索等事件需要花费大量时间来执行.[更新]事实证明我的应用程序正在渲染一些东西如果我删除套接字连接,请查看更新2

[问题:]我应该怎样做才能提高App的性能?(不喜欢使用状态或使用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 我也从map转到Flatlist.

[更新:2]我发现在我的应用程序中发生了无休止的渲染,这可能让我的线程忙碌(我的意思是它是无穷无尽的,不必要地传递道具).我在单独的Stackoverflow线程上问了同样的问题,但没有得到正确的响应,因为它与性能有关,我想在这里给它一个赏金.

请检查此线程:无限渲染React

[答案更新:]虽然这里有很多很好的答案,但万一有人想了解它是如何工作的,你可以克隆我的存储库并此提交之前返回.我已将提交链接到我的问题已解决的位置(因此您可能需要返回并查看我做错了什么).此外,所有答案都非常有用,不难理解,所以你一定要仔细阅读.



1> basbase..:

每次组件更新时,它都会启动一个新的套接字,导致内存泄漏,并导致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 {
    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 (
             item.short}
                renderItem={({item}) => 
                    {item.time}
                    {item.short}
                    {item.perc}
                    {item.price}
                }
            />
        );
    }
}



2> xadm..:

有许多标准方法可以提高应用程序的性能,最常见的是:

使用通常的反应优化(shouldComponentUpdate,PureComponent - 读取文档)

使用虚拟列表(限制数据的可见部分)

在这种情况下,我会添加:

不要在优化之前处理数据 - 格式化未更改的数据至少是不必要的.您可以插入中间组件(优化层),该组件将仅将格式化数据传递/更新为"原始数据"更改.

您可能不需要终极版在所有(在状态存储数据)当数据在同一个地方/结构简单,使用.当然,您可以将redux用于其他全局共享应用程序状态(fe过滤选项).

使用(react-native),搜索更合适?

UPDATE

有些代码在平均时间(repo)中发生了变化,此时(08.09)仍存在一个问题,可能导致内存泄漏.

您正在呼叫this.socket.on每个componentDidUpdate呼叫(错误编码的条件) - 不断添加新的处理程序!

componentDidUpdate() {
  // call all ONLY ONCE afer initial data loading
  if (!this.state.updateCoinData && !this.props.cryptoLoaded.length) {
    this.setState({updateCoinData: true}) // block condition
    this.socket.on('trades', (tradeMsg) => {

      // slice() is faster, new array instance
      // let updateCoinData = [...this.props.cryptoLoaded]; 
      let updateCoinData = this.props.cryptoLoaded.slice();

      for (let i=0; i

次要错误:初始提取状态在reducer中设置为true.

搜索性能问题我会看:

使它成为PureComponent;

increased并且decreased不需要在强制不必要的渲染调用的状态下保存;

我会使用更新时间(不保存在状态,只是作为父项中的prop传递,仅用于更新的行,在updateCoinData上面的代码中)并且仅为可见项导出方向(仅检查0和符号)差异(已计算perc)(来自渲染)并且仅在时间限制期间(渲染时间和数据更新道具之间的差异).也可以用.setTimeout

最后删除componentWillReceiveProps,componentDidUpdate并且shouldComponentUpdate(高度?)提高性能;


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了如何在方法参数中指定一个对象的协议,以及如何调用符合该协议的方法。以一个具体的示例说明了如何在方法参数中指定一个UIView子类对象,并且该对象需要符合PixelUI协议,同时方法需要能够访问该对象的属性。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • PeopleSoft安装镜像版本及导入语言包的方法
    本文介绍了PeopleSoft安装镜像的两个版本,分别是VirtualBox虚拟机版本和NativeOS版本,并详细说明了导入语言包的方法。对于Windows版本,可以通过psdmt.exe登录进入,并使用datamover脚本导入语言包。对于Linux版本,同样可以使用命令行方式执行datamover脚本导入语言包。导入语言包后,可以实现多种语言的登录。参考文献提供了相关链接以供深入了解。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
双子汐晨_312
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有