首页 > 其他分享 >了解 React 的 useMemo:它的作用、何时使用它以及最佳实践

了解 React 的 useMemo:它的作用、何时使用它以及最佳实践

时间:2024-09-21 16:50:22浏览次数:9  
标签:react gt return useMemo 何时 React usememo num 组件

react 是一个用于构建用户界面的强大库,但随着应用程序的增长,您可能会注意到性能有时会成为问题。这就是像 usememo 这样的 react hook 发挥作用的地方。在本文中,我们将深入探讨 usememo 的作用、何时有用以及使用它的最佳实践。我们还将介绍一些需要避免的常见陷阱。 什么是 usememo?usememo 是一个 react hook,允许你记住计算结果。简单来说,它会记住函数的结果,并且仅在其依赖项发生变化时才重新计算它。这可以防止不必要的计算并提高性能。这是一个基本示例:import react, { usememo } from 'react';function expensivecalculation({ num }) { const result = usememo(() =&gt; { console.log('calculating...'); return num * 2; }, [num]); return <div>the result is {result}</div>;}登录后复制在此示例中,usememo 中的函数仅在 num 更改时运行。如果 num 保持不变,react 将跳过计算并使用之前存储的结果。 为什么使用 usememo?使用 usememo 的主要原因是优化性能。在 react 中,只要组件的状态或 props 发生变化,组件就会重新渲染。这可能会导致昂贵的计算运行频率超过必要的频率,特别是在计算很复杂或组件树很大的情况下。 以下是 usememo 特别有用的一些场景: 1. 昂贵的计算:假设您有一个执行繁重计算的组件,例如过滤大型数据集。如果没有 usememo,此计算将在每次渲染上运行,这可能会减慢您的应用程序的速度。import react, { usememo } from 'react';function expensivecalculationcomponent({ numbers }) { // expensive calculation: filtering even numbers const evennumbers = usememo(() =&gt; { console.log('filtering even numbers...'); return numbers.filter(num =&gt; num % 2 === 0); }, [numbers]); return ( <div> <h2>even numbers</h2> <ul> {evennumbers.map((num) =&gt; ( <li key="{num}">{num}</li> ))} </ul></div> );}// usageconst numbersarray = array.from({ length: 100000 }, (_, i) =&gt; i + 1);export default function app() { return <expensivecalculationcomponent numbers="{numbersarray}"></expensivecalculationcomponent>;}登录后复制在这个例子中,过滤操作的计算量很大。通过将其包装在 usememo 中,它仅在数字数组更改时运行,而不是在每次渲染时运行。 2. 避免重新创建对象或数组在每次渲染时将新的数组或对象作为道具传递给子组件可能会导致不必要的重新渲染,即使内容没有更改。 usememo 可用于记忆数组或对象。import react, { usememo } from 'react';function childcomponent({ items }) { console.log('child component re-rendered'); return ( 登录后复制 {items.map((item, index) => ( {item} ))} );}export default function parentcomponent() { const items = usememo(() => ['apple', 'banana', 'cherry'], []); return ( fruit list );}这里,使用 usememo 记忆 items 数组,确保 childcomponent 仅在必要时重新渲染。如果没有 usememo,每次渲染都会创建一个新数组,从而导致子组件不必要的重新渲染。 3. 优化大型组件树使用大型组件树时,使用 usememo 可以帮助减少不必要的重新渲染,特别是对于深度嵌套组件中昂贵的操作。import react, { usememo } from 'react';function largecomponenttree({ data }) { const processeddata = usememo(() =&gt; { console.log('processing data for large component tree...'); return data.map(item =&gt; ({ ...item, processed: true })); }, [data]); return ( <div> <h2>processed data</h2> {processeddata.map((item, index) =&gt; ( <div key="{index}">{item.name}</div> ))} </div> );}// usageconst largedataset = array.from({ length: 1000 }, (_, i) =&gt; ({ name: `item ${i + 1}` }));export default function app() { return <largecomponenttree data="{largedataset}"></largecomponenttree>;}登录后复制在此示例中,usememo 用于在将大型数据集渲染到组件中之前对其进行处理。通过记忆处理后的数据,组件仅在原始 data prop 更改时重新计算数据,避免了不必要的重新处理并提高了性能。 usememo 的最佳实践虽然 usememo 是一个强大的工具,但正确使用它也很重要。以下是一些最佳实践:用它来优化性能:昂贵的计算是何时使用 usememo 的一个很好的例子。它执行一个可能昂贵的操作(对数组求和并将结果相乘),该操作取决于数字和乘法器状态变量。const expensivecalculation = usememo(() =&gt; { console.log('calculating sum...'); return numbers.reduce((acc, num) =&gt; acc + num, 0) * multiplier;}, [numbers, multiplier]);登录后复制此计算只会在数字或乘数发生变化时重新运行,可能会节省其他重新渲染时不必要的重新计算。保持依赖关系准确:请注意昂贵计算的 usememo 挂钩如何在其依赖项数组中包含数字和乘数。这可确保每当这些值发生变化时都会重新运行计算。}, [numbers, multiplier]); // correct dependencies登录后复制如果我们从依赖项中省略了乘数,当乘数发生变化时,计算将不会更新,从而导致错误的结果。不要过度使用 usememo:simplevalue 示例显示了 usememo 的不必要使用:const simplevalue = usememo(() =&gt; { return 42; // this is not a complex calculation}, []); // empty dependencies array登录后复制这种记忆是不必要的,因为该值是常数并且计算很简单。它增加了复杂性,但没有任何性能优势。了解何时不使用它:handleclick 函数是何时不使用 usememo 的一个很好的示例:const handleClick = () =&gt; { console.log('Button clicked');};登录后复制这个函数很简单,不涉及任何繁重的计算。记住它会给代码增加不必要的复杂性,而不会提供任何显着的性能改进。通过遵循这些最佳实践,您可以有效地使用 usememo 来优化您的 react 组件,而不会使代码过于复杂或因不正确的依赖管理而引入潜在的错误。 要避免的常见陷阱虽然 usememo 是一个很棒的工具,但有一些常见错误需要注意:忽略依赖关系:如果您忘记在数组中包含依赖关系,则记忆的值可能会变得过时,从而导致错误。始终仔细检查记忆函数中使用的所有变量是否都包含在依赖项数组中。到处使用 usememo:并非每个函数或值都需要被记忆。如果您的代码没有性能问题,添加 usememo 不会改善情况。事实上,由于记忆的开销,它可能会稍微减慢速度。对重新渲染的误解:usememo 仅优化记忆化计算,而不是组件的整个渲染过程。如果组件仍然收到新的 props 或状态,即使记忆的值没有改变,它也会重新渲染。 结论usememo 是一个用于优化 react 应用程序性能的强大钩子,但应该明智地使用它。专注于在存在真正性能瓶颈的地方使用它,并始终确保您的依赖项是正确的。通过遵循这些最佳实践,您可以避免常见的陷阱并在项目中充分利用 usememo。 以上就是了解 React 的 useMemo:它的作用、何时使用它以及最佳实践的详细内容,更多请关注我的其它相关文章!

标签:react,gt,return,useMemo,何时,React,usememo,num,组件
From: https://www.cnblogs.com/aow054/p/18424217

相关文章

  • 了解 React Cache 功能
    随着react生态系统的不断扩大,优化数据获取的更强大的工具之一就是缓存功能。此内置功能允许您执行许多操作,例如有效管理和存储服务器数据、减少冗余网络请求以及提高整体应用程序性能。在本文中,我们将了解react中的缓存功能、它的好处以及如何使用它。什么是react缓存功......
  • Suspense and Fiber- The Intricate Machinery Behind React&#s Rendering Elegance
    reactfiber是react并发渲染的核心,它使框架能够将任务分解为更小的单元,并优先处理更重要的任务,从而实现更流畅、响应更灵敏的用户界面。当与suspense配合使用时,它允许react“暂停”渲染,在等待数据获取或计算等任务完成时显示后备ui。fiber是一个javascript对象,代表rea......
  • Redux 与 ContextProvider:在 React 应用程序中选择状态管理
    长话短说当您需要一个强大且可扩展的解决方案来进行复杂的状态管理时,请使用redux,特别是在具有许多组件与状态交互的大型应用程序中。当你的状态管理需求更简单、更本地化,或者当你想避免小型应用程序中redux的开销时,请使用context.provider。让我们开始吧在react或nex......
  • React 设计模式~布局组件~
    屏幕分割器这种模式经常用于由侧边栏、主栏等组成的常见布局。?app.jsimport{splitscreen}from"./components/split-screen";constleftside=({title})=>{return<h2style="{{"backgroundcolor:>{title}</h2>;};constrightside=({title})=>{......
  • ReactJS 设计模式:编写健壮且可扩展的组件
    reactjs中的设计模式为应用程序开发中的常见问题提供了标准化且经过验证的解决方案。使用这些模式不仅使您的代码更具可读性和可维护性,而且还增强了其可扩展性和健壮性。让我们深入研究一些最流行的reactjs设计模式,并通过示例来说明它们的用法。1.容器和表示组件模式容......
  • Recharts:终极 React 图表库
    在当今数据驱动的世界中,有效可视化数据的能力比以往任何时候都更加重要。无论您是数据科学家、开发人员还是业务分析师,创建富有洞察力的交互式图表都可以帮助您清晰地传达复杂的信息。用于此目的的最佳工具之一是recharts——一个完全基于react组件构建的可组合图表库。在这篇......
  • React Native 最佳实践
    如果您是reactnative开发者初学者,或者有经验,那么您必须意识到代码实践是一项不容妥协的技能。作为开发人员,项目的交付是必须的,但编写可扩展且高质量的代码将对您和您的团队的未来有所帮助。在我们继续之前,这些实践可以在reactnativecli或expo项目上使用。从2024年开始,r......
  • React 与 React (RC):主要区别和迁移技巧与示例
    react是用于构建用户界面的流行javascript库,随着每个新版本的发布而不断发展。在这篇博文中,我们将探讨react18和即将推出的react19(目前处于候选发布阶段)之间的主要区别,提供新功能示例,并为使用react和vite的开发人员提供迁移技巧。目录简介react19的当前状态与......
  • React 中的上下文:更好的方法
    首先看一下这段代码:usercontext.jsimport{createcontext,usecontext}from"react";constusercontext=createcontext({user:{name:'defaultuser',age:0},setuser:()=>{}//wecanalsopassstatehere.});exportconstthemeprovider=......
  • React 心态:新 React 开发人员应该如何思考
    react是一个用于构建用户界面的流行javascript库,它使开发人员能够创建可重用的组件并有效管理复杂的ui,从而彻底改变了前端开发。然而,采用正确的心态对于新开发人员驾驭react独特范例至关重要。让我们探索塑造“react心态”的基本原则和策略。1.组件化思考react的核......