”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使您的 React 应用程序更快:性能提示和最佳实践

如何使您的 React 应用程序更快:性能提示和最佳实践

发布于2024-11-08
浏览:472

啊,反应!我们喜爱的用于构建 UI 的库。它就像一剂神奇的药剂,让我们的网络应用程序感觉具有交互性和快速性——直到有一天,它却没有了。突然,你注意到事情变慢了。点击按钮就像用信鸽寄信一样。您的应用程序从闪电般的速度变成了慢吞吞的速度,用户开始给您“看”。

但是别担心!就像咖啡可以解决大部分生活问题一样(或者我们是这么认为的),一些关键技术可以增强你的 React 应用程序并使其恢复到最高速度。让我们探索 6 种简单的方法来优化你的 React 应用程序,让它比你每天喝咖啡更快。

1.代码分割:仅加载您需要的内容

曾经走进一个房间,打开所有的灯,然后意识到你只需要一盏灯吗?当你将所有内容捆绑成一大块时,这就是你的 React 应用程序所做的事情。相反,通过代码分割,您只需加载应用程序当前需要的部分。就像逐个房间打开灯一样!

使用 React.lazy() 和 Suspense 是实现此目的的完美方法:

import React, { Suspense } from 'react';

const LazyComponent = React.lazy(() => import('./LazyComponent'));

const App = () => {
  return (
    Loading...}>
      
    
  );
}

为什么有帮助:代码分割通过推迟加载未使用的代码直到必要时来减少应用程序的初始加载时间。用户无需等待整个应用程序加载即可看到屏幕上的内容。

2.延迟加载图像:不要一次加载所有零食

想象一下,订购一份披萨,却收到了一年的食品杂货。听起来很荒谬,对吧?好吧,这就是当您预先加载所有图像时会发生的情况。相反,延迟加载图像,因此您只获取必要的图像,就像一次订购一个披萨一样。

使用像react-lazyload这样的库是一个快速解决方案:

import LazyLoad from 'react-lazyload';


  Lazy Loaded Image

为什么有帮助:通过延迟加载图像,您可以减少初始页面加载时间,并且仅在需要时下载图像,从而提高性能和用户体验。

3. useCallback 和 useMemo:React 的内存提升

就像你不断重复使用同一个咖啡杯以节省清洗时间一样,如果你允许,React 可以重复使用值和函数! useCallbackuseMemo 是帮助您存储昂贵的计算或函数的钩子,因此它们不会在每次渲染时重新计算。

useMemo 示例:

const expensiveCalculation = (num) => {
  return num ** 2;
};

const MyComponent = ({ num }) => {
  const squaredNumber = React.useMemo(() => expensiveCalculation(num), [num]);

  return 
{squaredNumber}
; }

useCallback 示例:

const handleClick = useCallback(() => {
  console.log("Clicked");
}, []);

为什么有帮助:使用 useMemo,React 不必重做昂贵的计算。 useCallback 会阻止您在每次渲染时创建新函数。这可以让 React 平稳运行——就像升级 RAM 一样!

4.使用 React.memo 进行记忆:停止不必要的重新渲染

你有一个朋友一遍又一遍地重复同一个故事吗? React 也可以像这样——即使不需要,也会重新渲染组件!这就是 React.memo 的用武之地,它阻止 React 重新渲染组件,除非它们的 props 发生变化。

const MyComponent = React.memo(({ value }) => {
  return 
{value}
; });

为什么有帮助:React.memo 就像告诉 React,“嘿,你以前听说过这个!除非有新的东西,否则不要重复。”它避免了不必要的重新渲染,节省了时间和资源。

5.有效管理状态:仅在需要时才提升状态

提升状态是 React 中的常见模式,但有时我们会因为将状态提升得太高或在错误的位置管理太多状态而感到内疚。这可能会导致过度的重新渲染。尽可能保持组件本地状态,并仅在真正必要时提升状态来避免不必要的重新渲染。

const ParentComponent = () => {
  const [sharedState, setSharedState] = useState(false);

  return (
    
      
      
    >
  );
}

const ChildComponent = ({ sharedState }) => {
  return 
{sharedState ? 'Active' : 'Inactive'}
; } const AnotherChild = ({ setSharedState }) => { return ; }

为什么有帮助:通过更仔细地管理状态并仅在需要时提升它,您可以避免兄弟组件不必要的重新渲染。这可以让您的应用程序专注且高效。

6。消除用户输入的抖动:冷静,反应!

想象一下,有人疯狂地在搜索栏中输入内容,而您的应用程序试图处理每一次击键。糟糕的React可能是子弹出汗了!输入去抖动 - 仅在用户暂停后处理输入的过程,而不是在每次按键时处理输入。

使用lodash.debounce可以解决这个问题:

import _ from 'lodash';

const Search = () => {
  const [query, setQuery] = useState('');

  const debouncedSearch = _.debounce((input) => {
    // Do your search logic
    console.log(input);
  }, 500);

  const handleChange = (e) => {
    setQuery(e?.target?.value);
    debouncedSearch(e?.target?.value);
  };

  return ;
}

为什么有帮助:React 不会在每次击键时都陷入恐慌,反跳动可以让它喘口气。这可以确保在处理实时用户输入(例如搜索或表单字段)时获得更好的性能。

结论:优化 React 应用程序并不是什么火箭科学——它更像是确保你不会一口气喝六杯咖啡!从代码分割到延迟加载图像,这些技术将帮助您保持 React 应用程序的快速响应。因此,下次当你的应用程序开始感觉迟缓时,请记住:这不是 React 的错——它只是需要一点优化!

请记住,优化 React 应用程序是一种平衡。您不需要立即投入所有这些技术。相反,确定您的应用程序的瓶颈,应用适当的优化,然后观察您的应用程序变得比您喝完咖啡的速度还要快!



感谢您的阅读,如果您喜欢这篇文章,请分享并留下建议。


How to Make Your React App Faster: erformance Tips and Best Practices

与我联系

网站:Hardik Gohil

Github:https://github.com/HardikGohilHLR

Linkedin:https://www.linkedin.com/in/hardikgohilhlr

谢谢❤️

版本声明 本文转载于:https://dev.to/hardikgohilhlr/how-to-make-your-react-app-faster-6-performance-tips-and-best-practices-4hd3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-05-01
  • Pandas多字段分组差异计算方法
    Pandas多字段分组差异计算方法
    Grouped Differences in Pandas with Multiple FieldsIn this situation, we aim to calculate the differences in scores for different site and country comb...
    编程 发布于2025-05-01
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-05-01
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-01
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-05-01
  • 在Go语言中如何简洁定义10的幂常量
    在Go语言中如何简洁定义10的幂常量
    在GO 利用浮点线文字一种简洁的方式是使用浮点文字,该方法是使用floingpoint protals。写作1E3比写作1000更有效。这是一个示例(67个没有空间的字符):的文字用于未构图的整数常数,我们可以将1000用于KB,并用KB将随后的常量乘以KB,如下所示(77个没有空格的字符):,作...
    编程 发布于2025-05-01
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-01
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-05-01
  • Pandas长格式转宽格式详解:逐步指南
    Pandas长格式转宽格式详解:逐步指南
    在pandas中从长到宽的数据:综合指南 将数据从长到宽的格式转换为pandas,尤其是在使用Melt/stack/stack/unstack方法时。例如,考虑以下长格式数据框架:, “高度”:[6,6,6,5], “产品”:['蝙蝠',“球”,“魔杖”,“笔”],...
    编程 发布于2025-05-01
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-05-01
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-05-01
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-05-01
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-01
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-05-01
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3