”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 驯服 React 野兽:如何避免高反应性 React 应用程序

驯服 React 野兽:如何避免高反应性 React 应用程序

发布于2024-07-31
浏览:124

Taming the React Beast: How to Avoid Highly Reactive React Applications

介绍

是否曾经发现自己处于 React 应用程序重新渲染的龙卷风中,感觉自己一直在追逐性能错误?你不是一个人。 React 中的高反应性甚至可以将最简单的任务变成效率低下且令人沮丧的迷宫。不要害怕,因为在这篇文章中,我们将探讨一些常见的陷阱并分享轶事,以帮助您保持 React 应用程序的流畅和高效。

1. 过度渴望的国家的故事

我曾经参与过一个项目,其中文本输入字段中的每次击键都会触发完整的组件重新渲染。起初这似乎无害,但随着应用程序的增长,延迟变得难以忍受。罪魁祸首?在顶层组件存储太多状态。

建议:尽可能本地化您所在的州。使用 useReducer 进行复杂的状态逻辑并避免不必要的状态提升。

2. 上下文难题

在另一个实例中,全局上下文用于从主题设置到用户首选项的所有内容。每次更改,无论多么小,都会导致多个组件重新渲染。结果?用户体验迟缓。

建议: 分割你的上下文。使用多个较小的上下文来解决不同的问题。这最大限度地减少了状态更改时需要重新渲染的组件数量。

3. 记忆海市蜃楼

一位同事曾经在各处添加了useMemo和useCallback,认为这会神奇地解决性能问题。然而,使用不当导致的问题比它解决的问题还要多,导致微妙的错误并使代码更难维护。

建议: 明智地使用记忆。了解成本和收益。只记住昂贵的计算和不经常改变的函数。

4. 支柱钻井困境

螺旋钻可能会使您的组件变得过于繁琐。在一个项目中,深度嵌套的组件接收的 props 几乎没有变化。这导致了一系列不必要的更新。

建议: 利用 Redux 或 Zustand 等上下文或状态管理库来避免 prop 钻探。这可以让你的组件树更干净并减少不必要的重新渲染。

5. 雪崩效应

在一个特别具有挑战性的项目中,每次数据获取都会触发一系列 useEffect 调用,每次都会更新状态并导致更多的重新渲染。这是一个典型的“效应雪崩”案例。

建议: 构建尽可能独立的效果。使用清理函数来避免不必要的重新渲染,并确保正确列出依赖项以防止无限循环。

结论

避免高反应性的 React 应用程序需要对细节有敏锐的洞察力并了解 React 的渲染机制如何工作。通过本地化状态、分割上下文、明智地使用记忆、避免道具钻探以及正确管理效果,您可以驯服 React 野兽并创建一个高性能、可维护的应用程序。请记住,这里的每一条建议都来自现实世界的经验和艰难的教训。快乐反应!

版本声明 本文转载于:https://dev.to/doozieakshay/taming-the-react-beast-how-to-avoid-highly-reactive-react-applications-33nj?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-03-25
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-03-25
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-03-25
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-25
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-03-25
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-03-25
  • Numpy的矢量函数如何有效地证明数组的合理性?
    Numpy的矢量函数如何有效地证明数组的合理性?
    使用向量函数 Numpy提供使用矢量化函数的数组合理的方法,提供改进的性能和代码简单性,与传统的python循环相比,提供了改进的性能和代码简单性。在保持其形状的同时,左,右,向上或向下的非零元素。以下numpy实现执行有效的理由: = a [mask] 别的: out.t ...
    编程 发布于2025-03-25
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-03-25
  • 如何基于唯一的电子邮件值合并和重塑对象数组?
    如何基于唯一的电子邮件值合并和重塑对象数组?
    在数据操作领域中合并和将对象的数组与唯一的电子邮件值 考虑需要合并两个对象阵列,每个对象都包含电子邮件属性。目标是创建一个包含所有唯一电子邮件值的新数组。 , (对象)[“电子邮件” =>“ [电子邮件  prected]”], (对象)[“电子邮件” =>“ wefe...
    编程 发布于2025-03-25
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-03-25
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-25
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-03-25
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-03-25
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-25
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-25

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

Copyright© 2022 湘ICP备2022001581号-3