构建高性能 React 应用程序的关键之一是避免不必要的重新渲染。 React 的渲染引擎非常高效,但防止在不需要的地方重新渲染仍然至关重要。在这篇文章中,我们将介绍常见错误以及如何避免这些错误。
1. 使用 React.memo 记忆组件
当组件的 props 没有改变时,记忆化可以帮助你跳过重新渲染。然而,如果不实现自定义比较函数,很容易误用 React.memo。
错误用法:
const MemoizedComponent = React.memo(MyComponent);
这仅检查 props 引用是否已更改,这可能并不总是足够的。
正确用法:
const MemoizedComponent = React.memo(MyComponent, (prevProps, nextProps) => { return prevProps.itemId === nextProps.itemId; });
在这里,我们使用自定义比较函数,仅当 itemId 属性更改时才会触发重新渲染。
2. 避免过多使用内联函数
在 JSX 中使用内联函数可能会导致不必要的重新渲染,因为 React 在每次渲染时都会将新函数视为新的 prop。
错误用法:
function ButtonComponent() { return <button onclick="{()"> handleClick()}>Click me</button>; }
这会导致在每次渲染时重新创建handleClick,从而导致不必要的重新渲染。
正确用法:
import { useCallback } from 'react'; function ButtonComponent() { const handleClick = useCallback(() => { // Handle click logic }, []); return <button onclick="{handleClick}">Click me</button>; }
通过使用 useCallback,我们记住了 handleClick 函数,从而防止在每次渲染时进行不必要的重新创建。
3. 利用 PureComponent
使用类组件时,使用 React.PureComponent 可确保组件仅在其 props 或状态更改时重新渲染。如果您使用 React.Component,可能会导致不必要的重新渲染。
错误用法:
class CardComponent extends React.Component { // Component logic }
正确用法:
class CardComponent extends React.PureComponent { // Component logic }
通过扩展 React.PureComponent,React 将浅层比较 props 和 state,避免不必要的重新渲染。
4. 优化功能组件中的useSelector
当使用react-redux中的useSelector时,仅选择状态的必要部分非常重要。
错误用法:
import { useSelector } from 'react-redux'; const DataComponent = () => { const globalState = useSelector((state) => state); // Render logic };
每当状态的任何部分发生变化时,这都会导致组件重新渲染。
正确用法:
import { useSelector } from 'react-redux'; const DataComponent = () => { const selectedData = useSelector((state) => state.specificSlice); // Render logic based on specific slice };
通过仅选择状态的必要部分,可以最大限度地减少重新渲染。
5. 在类组件中实现shouldComponentUpdate
对于不扩展 PureComponent 的类组件,手动实现 shouldComponentUpdate 可以更精细地控制组件何时重新渲染。
错误用法:
class ListItem extends React.Component { // Component logic }
每次父组件渲染时都会重新渲染,即使 props 和 state 没有改变。
正确用法:
class ListItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { return this.props.itemId !== nextProps.itemId || this.state.value !== nextState.value; } // Component logic }
通过自定义shouldComponentUpdate,我们确保组件仅在 itemId 属性或值状态发生变化时重新渲染。
结论
通过采用这些技术,您可以显着减少 React 应用程序中不必要的重新渲染,从而获得更好的性能。使用 React.memo 实现记忆化、利用 PureComponent 以及微调 shouldComponentUpdate 是优化 React 组件的关键策略。
了解何时以及如何优化渲染可以通过提供更快、响应更灵敏的应用程序来极大地增强用户体验。
参考:
- 极客们的极客们。 (2023)。 React 中的记忆化是什么?
- 同步融合。 (2024)。 React 中的记忆化
- 海格拉夫。 (2024)。什么是 React Memo 以及如何使用它?
- Refine.dev。 (2024)。带有示例的 React 备忘录指南
如果您发现本指南有用,请考虑与其他人分享! ?
本博客提供了更新且全面的概述,介绍如何避免 React 应用程序中不必要的重新渲染,同时结合最佳实践并更改变量名称,以提高现代 Web 开发实践的清晰度和相关性。
引用:
[1] https://www.geeksforgeeks.org/what-is-memoization-in-react/
[2] https://stackoverflow.com/questions/74013864/why-arent-all-react-components-wrapped-with-react-memo-by-default
[3] https://www.syncfusion.com/blogs/post/what-is-memoization-in-react
[4] https://hygraph.com/blog/react-memo
[5] https://refine.dev/blog/react-memo-guide/
[6] https://dmitripavlutin.com/use-react-memo-wisely/
[7] https://www.topcoder.com/thrive/articles/memoization-in-react-js
[8] https://react.dev/reference/react/memo
以上是避免 React 中不必要的重新渲染的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。