React常见优化问题

在React开发中,性能优化是一个重要且持续的过程,旨在提升应用的响应速度和用户体验。以下是一些常见的React优化问题详解,并附上相应的代码示例。
1. 避免不必要的组件渲染
React组件的渲染是由其props或state的变化触发的。但是,并非所有的props或state变化都需要重新渲染组件。通过避免不必要的渲染,可以显著提升应用性能。
解决方案:
shouldComponentUpdate(类组件):通过实现这个方法,可以手动控制组件是否应该基于新的props和state进行更新。如果返回false,则组件不会重新渲染。
jsx
  class MyComponent extends React.Component {
    shouldComponentUpdate(nextProps, nextState) {
      if (nextProps.id !== this.props.id) {
        return true;
      }
      return false;
    }

    render() {
      return <div>{this.props.id}</div>;
    }
  }
  
React.memo(函数组件):这是React提供的一个高阶组件,用于对函数组件进行记忆化。它仅会对props进行浅比较,如果props没有变化,则不会重新渲染组件。
jsx
  const MyComponent = React.memo(function MyComponent(props) {
    return <div>{props.id}</div>;
  });
  
React.PureComponent(类组件):这是React提供的一个内置类组件,内部实现了shouldComponentUpdate的浅比较逻辑。适用于props和state都是不可变对象的场景。
jsx
  class MyComponent extends React.PureComponent {
    render() {
      return <div>{this.props.id}</div>;
    }
  }
  
2. 使用懒加载和代码分割
当应用变得复杂时,初始加载时间可能会变长。懒加载允许应用按需加载组件,而不是在初始加载时加载所有内容。
解决方案:
React.lazy:结合Suspense组件,可以实现组件的懒加载。
jsx
  const LazyComponent = React.lazy(() => import('./LazyComponent'));

  function App() {
    return (
      <React.Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </React.Suspense>
    );
  }
  
3. 使用虚拟列表
对于渲染大量数据的列表,使用虚拟列表可以显著提升性能。虚拟列表只渲染可视区域内的项,而不是整个列表。
解决方案:
react-window 或 react-virtualized:这些是流行的React虚拟列表库,可以帮助开发者轻松实现虚拟列表。
jsx
  import { FixedSizeList as List } from 'react-window';

  function Row({ index, style }) {
    return <div style={style}>Row {index}</div>;
  }

  function MyList() {
    return (
      <List
        height={150}
        itemCount={1000}
        itemSize={35}
        width={300}
      >
        {Row}
      </List>
    );
  }
  
4. 避免不必要的状态更新
在React中,每次调用setState都会触发组件的重新渲染。因此,应该避免在不需要时更新状态。
解决方案:
使用shouldComponentUpdate或React.memo:如上所述,这些方法可以控制组件的渲染行为。
批量更新状态:如果需要在短时间内多次更新状态,可以考虑使用setState的回调函数来实现批量更新。
5. 使用Hooks优化性能
React Hooks提供了useMemo和useCallback等API,可以帮助开发者缓存计算结果和函数引用,从而避免在每次渲染时都重新计算或创建新的函数引用。
解决方案:
useMemo:用于缓存计算结果。
jsx
  const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  
useCallback:用于缓存函数引用。
jsx
  const memoizedCallback = useCallback(() => {
    doSomething(a, b);
  }, [a, b]);
  
通过应用上述优化策略,React应用的性能和用户体验可以得到显著提升。开发者需要根据具体的项目需求和性能问题,选择合适的优化方法来提高React应用的性能。

————————————————————————
React中更具体的优化案例包括:
使用React.memo避免函数组件不必要的重新渲染。
使用shouldComponentUpdate或PureComponent减少类组件的渲染次数。
利用useMemo缓存计算结果,避免重复计算。
使用useCallback缓存函数引用,防止子组件因父组件传递的新函数而重新渲染。
通过代码分割和懒加载,按需加载组件,减少初始加载时间。
使用虚拟列表渲染大量数据,仅渲染可视区域内的项。

————————————————————————

当然可以提供更多React优化技巧的案例。以下是一些具体的React优化技巧案例:
使用React.memo进行函数组件优化
案例描述:当函数组件的props没有变化时,React会重新渲染该组件,即使组件的输出没有变化。使用React.memo可以缓存组件的渲染结果,当props没有变化时,React将不会重新渲染该组件,而是直接返回上次的渲染结果。
示例代码:
jsx
     const MyComponent = React.memo(function MyComponent(props) {
       /* render 逻辑 */
       return <div>{props.value}</div>;
     });
     
使用shouldComponentUpdate或PureComponent减少类组件的渲染
案例描述:对于类组件,React会在组件的props或state发生变化时重新渲染组件。通过重写shouldComponentUpdate方法或使用React.PureComponent,可以自定义组件的更新逻辑,减少不必要的渲染。
示例代码(使用PureComponent):
jsx
     class MyComponent extends React.PureComponent {
       render() {
         return <div>{this.props.value}</div>;
       }
     }
     
利用useMemo缓存计算结果
案例描述:当组件中需要进行昂贵的计算,而这些计算的结果在props没有变化时不会改变时,可以使用useMemo来缓存这些计算结果,避免在每次渲染时都进行重复计算。
示例代码:
jsx
     const MyComponent = ({ data }) => {
       const expensiveResult = React.useMemo(() => {
         return computeExpensiveValue(data);
       }, [data]);

       return <div>{expensiveResult}</div>;
     };
     
使用useCallback缓存函数引用
案例描述:当函数组件中的函数被传递给子组件作为props,并且该函数在每次渲染时都重新创建时,子组件可能会因为接收到新的函数引用而重新渲染。使用useCallback可以缓存这些函数,避免子组件的不必要渲染。
示例代码:
jsx
     const MyComponent = ({ onClick }) => {
       const memoizedOnClick = React.useCallback(() => {
         // 处理点击事件
       }, []); // 依赖项为空数组,表示该函数不会因props或state的变化而变化

       return <Button onClick={memoizedOnClick}>Click me</Button>;
     };
     
代码分割和懒加载
案例描述:当应用变得复杂时,初始加载时间可能会变长。使用React.lazy和Suspense可以实现组件的懒加载,按需加载组件,减少初始加载时间。
示例代码:
jsx
     const LazyComponent = React.lazy(() => import('./LazyComponent'));

     function App() {
       return (
         <React.Suspense fallback={<div>Loading...</div>}>
           <LazyComponent />
         </React.Suspense>
       );
     }
     
这些案例展示了React优化技巧的实际应用,可以帮助开发者提升React应用的性能和用户体验。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439754.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-npm支持-如何使用npm包

文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…

python泵站设备运行预警信息管理系统

目录 功能介绍具体实现截图技术栈和环境说明python语言解决的思路性能/安全/负载方面核心代码部分展示详细视频演示源码获取方式 功能介绍 用户端 注册登录&#xff1a;用户可以注册账号并登录系统。 西电泵站简介&#xff1a;提供泵站的历史、功能和重要性等详细介绍。 泵站…

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新

华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…

在Docker中运行微服务注册中心Eureka

1、Docker简介&#xff1a; 作为开发者&#xff0c;经常遇到一个头大的问题&#xff1a;“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中&#xff0c;避免了因环境差异带来的兼容性问题&#xff0c;能够有效的解决此类问题。 通过Docker&#xff0c;开发者可…

角色动画——RootMotion全解

1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 ​ 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格&#xff0c;以便能够将其动画化。 对于人…

Linux驱动开发——LED驱动开发

文章目录 1 概述1.1 说明 2 基础知识2.1 地址映射2.1.1 ioremap函数2.1.2 iounmap函数 2.2 I/O内存访问函数2.2.1 读操作函数2.2.2 写操作函数 3 硬件原理图分析4 RK3568 GPIO驱动原理4.1 引脚复用设置4.2 引脚驱动能力配置4.3 GPIO输入输出设置4.4 GPIO引脚高低电平设置 5 实验…

【GeekBand】C++设计模式笔记5_Observer_观察者模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK&#xff08;node js&#xff09; 学习内容&#xff1a; 使用AWS SDK&#xff08;node js&#xff09; 1. AWS SDK&#xff08;node js&#xff09; AWS支持多种SDK开发(除了AWS CLI&#xff0c;还支持其他的SDK) AndroidPythonNode.js(Javas…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

五种IO模型与阻塞IO

一、前言 在网络中通信的本质其实是网络中的两台主机的进程间进行通信&#xff0c;而进程通信的本质就是IO。 IO分为输入&#xff08;input&#xff09;和输出&#xff08;output&#xff09;站在进程的角度讲&#xff0c;进程出去数据为输出&#xff0c;外部数据进入进程为输…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展&#xff0c;图像生成与反推技术已经成为了AI领域的一大热点。今天&#xff0c;我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux&#xff0c;以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

centos7安装配置nginx

先安装依赖 安装依赖之前最好先执行下update yum update yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y cd /usr/local/nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd /usr/local/ngi…

双非本 985 硕,上岸快手大模型算法岗!

最近已有不少大厂都在秋招宣讲&#xff0c;也有一些已在 Offer 发放阶段了。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行…

高校校园交友系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理&#xff0c;轮播图信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;用户&#…

反调试—1

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…

fiddler抓包18-2_导出jmeter、postman脚本(带请求头)

课程大纲 1. Fiddler导出请求为curl脚本 选中请求&#xff0c;“文件” - “导出会话” - “选中的会话” - “cURL Script”。 2. 导入jmeter ① 复制curl脚本。 ② 打开jmeter&#xff0c;“工具” - “import from cURL”&#xff0c;粘贴脚本&#xff0c;勾选“Add cooki…

二分查找一>寻找峰值

1.题目&#xff1a; 2.解析&#xff1a; 暴力遍历代码&#xff1a;O(N),由于该题数据很少所以可以通过 暴力遍历&#xff1a;O(N),由于该题数据很少所以可以通过int index 0;for(int i 1; i < nums.length-1; i) {//某段区域内一直递增&#xff0c;更新就indexif(nums[i]…