”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 与React Memo告别不必要的重新订阅者:分步教程

与React Memo告别不必要的重新订阅者:分步教程

发布于2025-03-23
浏览:527

[2

介绍 Say Goodbye to Unnecessary Re-Renders with React Memo: Step-by-Step Tutorial

反应应用程序经常处理大型数据集和复杂的组件,在这种情况下,不必要的重新订阅可能会对性能产生重大影响。为了解决这个问题,React提供了React.Memo-一种简单而强大的工具,可优化组件并减少渲染时间。在本指南中,我们将探讨React Memo的工作原理,为什么有用以及如何逐步实施。

什么是反应备忘录?

为什么反应备忘录?

在React中,每当其父零件重新渲染时,组件重新渲染。如果组件的输出不取决于其父母的变化,这可能会导致效率低下。例如,在具有许多组件的复杂UI中,您可能会看到过多的重新租赁,可能会看到滞后。使用React Memo可以通过在必要时仅更新组件来优化此功能。


问题反应备忘录解决

1。不必要的重新租赁

当父组件重新呈现时,其子零件也重新渲染。这可能会导致性能瓶颈,尤其是当组件显示静态数据或依靠不变的道具时。

2。复杂的UIS中的Laggy或缓慢的性能

具有深嵌套组件的应用程序可能会由于累积重新租赁而面临缓慢的性能。通过React Memo的备忘录有助于防止重新租赁不需要更新的组件,从而增强应用程序的响应能力。


React Memo的工作方式:逐步示例

让我们仔细研究React Memo的基本实现。我们将从一个简单的组件开始,该组件不使用备忘录,并查看添加React Memo如何有所作为。

步骤1:设置一个没有React Memo的简单计数器组件

导入react,{usestate}来自'react'; 功能计数器({count}){ console.log(“重新渲染的“计数器组件”); 返回

计数:{count}

; } 功能应用程序(){ const [count,setCount] = usestate(0); const [text,setText] = usestate(''); 返回 (
setCount(count 1)}>增量计数 setText(e.target.value)}占位符=“键入某物...” />
); } 导出默认应用;

解释

在此示例中,每当您在输入字段中输入时,计数值值保持不变,即使计数器组件重新呈现。这是一个不必要的重新渲染,我们可以通过React Memo预防。

步骤2:用React Memo进行优化

现在,让我们用react.memo将计数器组件包裹起来。

导入react,{usestate}来自'react'; const counter = react.memo(函数计数器({count}){ console.log(“重新渲染的“计数器组件”); 返回

计数:{count}

; }); 功能应用程序(){ const [count,setCount] = usestate(0); const [text,setText] = usestate(''); 返回 (
setCount(count 1)}>增量计数 setText(e.target.value)}占位符=“键入某物...” />
); } 导出默认应用;
import React, { useState } from 'react';

function Counter({ count }) {
  console.log('Counter component re-rendered');
  return 

Count: {count}

; } function App() { const [count, setCount] = useState(0); const [text, setText] = useState(''); return (
setText(e.target.value)} placeholder="Type something..." />
); } export default App;

与react.memo,计数器组件仅在其计数prop更改时重新呈现。现在,在输入字段中输入不再触发计数器的重新渲染,可以显着优化性能。

React Memo In Action:一种带有列表的实用场景

让我们进入一个更复杂的示例,以查看React Memo的真正好处。假设我们在每个项目旁边有一个带有“喜欢”按钮的项目列表。我们将演示React Memo在喜欢单个项目时如何防止过多的重新订阅者。

步骤1:在没有备忘录的情况下创建列表组件

导入react,{usestate}来自'react'; 功能项目({item,on Like}){ console.log(`渲染$ {item.name}`); 返回 (

{item.name}

); } 函数itemList(){ const [项目,setItems] = usestate([ {id:1,name:'item 1',喜欢:0}, {id:2,名称:'item 2',喜欢:0}, {id:3,名称:'项目3',喜欢:0}, ); const handlelike =(id)=> { setItems((previtems)=> previtems.map((item)=> item.id === id? {...项目,喜欢:item.likes 1}:项目 ) ); }; 返回 (
{items.map((item)=>( )}}
); } 导出默认项目列表;
import React, { useState } from 'react';

const Counter = React.memo(function Counter({ count }) {
  console.log('Counter component re-rendered');
  return 

Count: {count}

; }); function App() { const [count, setCount] = useState(0); const [text, setText] = useState(''); return (
setText(e.target.value)} placeholder="Type something..." />
); } export default App;
问题

在上述代码中,当您喜欢一个项目时,即使只有一个项目的喜欢变化,所有项目也会重新渲染。

步骤2:用React Memo优化项目组件


结果

现在,只有您单击的项目才能重新渲染,使UI更快,更有效。

何时使用React Memo?

import React, { useState } from 'react';

function Item({ item, onLike }) {
  console.log(`Rendering ${item.name}`);
  return (
    

{item.name}

); } function ItemList() { const [items, setItems] = useState([ { id: 1, name: 'Item 1', likes: 0 }, { id: 2, name: 'Item 2', likes: 0 }, { id: 3, name: 'Item 3', likes: 0 }, ]); const handleLike = (id) => { setItems((prevItems) => prevItems.map((item) => item.id === id ? { ...item, likes: item.likes 1 } : item ) ); }; return (
{items.map((item) => ( ))}
); } export default ItemList;

静态组件

:诸如标题或页脚等不经常更改的组件。

const Item = React.memo(function Item({ item, onLike }) {
  console.log(`Rendering ${item.name}`);
  return (
    

{item.name}

); });
:仅取决于呈现的组件。

组件的大列表

:列出了许多需要避免不必要的重新租赁的项目。


潜在的陷阱和最佳实践

    浅比较
  1. 性能监视:使用React DevTools识别哪些组件实际上从备忘录中受益。过度使用React Memo可以通过可忽略的性能提高导致代码复杂性。
  2. 常见问题(常见问题解答)
  3. 问题1:反应备忘录与Usememo和Usecallback有何不同?
  4. react memo
根据道具优化组件重新渲染。

在组件中caches计算值。

    usecallback
  1. Q2:我可以将React Memo与类组件一起使用吗? 否,React Memo仅适用于功能组件。但是,对于类组件,可以使用Purecomponent实现类似的行为。

  2. 结论

    React Memo是减少不必要的重新订阅并提高React应用程序性能的有价值工具。通过在纯功能组件或静态UI元素上有选择地使用它,您可以在不复杂的结构中优化React应用程序。遵循以下步骤,尝试示例,并继续进行试验,以找到您项目的最佳回忆策略!

版本声明 本文转载于:https://dev.to/chintanonweb/say-goodbye-to-unnecessary-re-renders-with-react-memo-step-by-step-tutorial-551j?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么尽管有效代码,为什么在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
  • CSS`text-overflow:Ellipsis'可以在多行文本上使用吗?
    CSS`text-overflow:Ellipsis'可以在多行文本上使用吗?
    在多琳文本上的省略号:a css conundrum 在受约束空间中使用多琳文本时,它是常见的,以寻求一种优雅的方式来指示截断的内容。一种流行的方法是使用“ text-overflow:Ellipsis” CSS属性。 However, its behavior on multiline tex...
    编程 发布于2025-03-25
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-03-25
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-03-25
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-03-25
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-25
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-03-25
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-03-25
  • 如何自动为点对点应用程序配置端口4900访问?
    如何自动为点对点应用程序配置端口4900访问?
    [2 [2 许多对等(P2P)应用程序依赖于特定端口,例如端口4900进行通信。 但是,路由器通常会阻止对这些端口的访问,从而阻碍P2P功能。 本指南概述了如何自动启用访问。 建立P2P连接需要以下步骤: 获取本地IP地址:标识设备上的所有本地IP地址。对于每个地址,在端口4900上创建一个UD...
    编程 发布于2025-03-25
  • 如何在MySQL触发器中删除相关数据:分步指南
    如何在MySQL触发器中删除相关数据:分步指南
    mySQL触发器:从deletion 以下是触发器的分解: 对于每行:指定触发器在“顾客”表中的每个删除行执行。开始:标记触发器的开始。[&& && && &&&华[&& &&&华[&& &&华表。[&& && &&& patron_info.pid = old.id:此条件确保要删除的特定行通...
    编程 发布于2025-03-25
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-03-25
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-03-25
  • 如何通过Python并行迭代两个列表?
    如何通过Python并行迭代两个列表?
    如何通过并行给定两个列表中的两个列表进行迭代,一个常见的任务是成对通过它们迭代。虽然迭代索引是一种可行的方法,但它可能不是最PYTHONIC的解决方案。 python 3解决方案在python 3中,zip()函数返回了一个小组的迭代器,使其有效地通过多迭代的多iterables中的iTermor...
    编程 发布于2025-03-25
  • 如何将JavaScript日期转换为MySQL DateTime并处理分钟调整?
    如何将JavaScript日期转换为MySQL DateTime并处理分钟调整?
    将JavaScript日期时间转换为mySQL dateTime 转换为mysql dateTime:,可以使用以下代码,可以使用以下代码:此代码以mySQL识别的格式生成一个dateTime字符串。将分钟添加到javascript dateTime:date.setMinutes(date.ge...
    编程 发布于2025-03-25
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-03-25

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

Copyright© 2022 湘ICP备2022001581号-3