当前位置: 首页 > news >正文

【React】性能提升方案:Reat.memo, useMemo,useCallback用法详解

前言:Reat.memo, useMemo,useCallback是React中用于性能优化的三个核心API,它们分别针对组件渲染,计算缓存和函数引用进行优化。

一、React.memo

作用:缓存组件,当父组件重新渲染时,若子组件的props未变化,则阻止子组件重新渲染。

注意:对渲染成本极低的组件(如简单的文本展示),使用React.memo,反而增加了浅比较的开销

          使用Redux的connet或自定义HOC,若未显式设置{ forwardRef: true},会导致ref或props传递中断,连带React.memo失效

const Child = React.memo(({ name }) => {console.log("子组件渲染");return <div>{name}</div>;});const Parent = () => {const [count, setCount] = useState(0);return (<div><button onClick={() => setCount(count + 1)}>点击</button><Child name="固定值" />  {/* 不会因父组件count变化而重新渲染 */}</div>);};

    二、useMemo

    作用:缓存计算结果,当依赖项未发生变化时避免重复计算

    注意:数据规模极小,不适合使用useMemo

              依赖项频繁变化,不适合用useMemo

              组件本身渲染频率低,不适合用useMemo

              过度嵌套useMemo,使代码难以维护,且可能引起隐蔽的依赖错误

    权衡标准:数据规模>100项

              计算复杂度>=O(线性对数增长)

              组件渲染频率>1次/秒

    缓存维护开销:浅比较成本:useMemo需比较依赖数组的每个值

                             内存占用:缓存结果会增加内存使用,尤其在频繁触发更新的组件中

    const ExpensiveComponent = ({ list }) => {const filteredList = useMemo(() => {return list.filter(item => item.value > 10);  // 复杂计算}, [list]);  // 仅当list变化时重新计算return <div>{filteredList.map(item => <span key={item.id}>{item.value}</span>)}</div>;};

      三、useCallback

      作用:缓存函数引用,避免子组件因函数引用变化而重新渲染

      注意:useCallback的依赖项过于频繁变化,导致缓存频繁失效,反而增加计算负担

                 过度嵌套useCallback,使代码难以维护,且可能引起隐蔽的依赖错误

      const Child = React.memo(({ onClick }) => {console.log("子组件渲染");return <button onClick={onClick}>点击</button>;
      });const Parent = () => {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(prev => prev + 1);}, []);  // 依赖为空,函数引用不变return (<div><Child onClick={handleClick} /><p>Count: {count}</p></div>);
      };
      
      • 四、性能瓶颈的判定标准

      • 可观测的渲染延迟:
      • 组件树深层嵌套导致渲染时间超过16ms(单帧时间),引发界面卡顿

        高频交互(如动画、滚动)因重复计算或渲染出现掉帧

      • 不必要的子组件渲染
      • 父组件状态变更连带触发大量子组件渲染,但子组件props实际未变化

        大型列表未做虚拟滚动或key优化,导致DOM操作阻塞主线程

      • 计算资源浪费
      • 复杂计算(如数组排序,数据转换)在每次渲染时,占用CPU资源


        文章转载自:

        http://EY25gKgz.qgmwt.cn
        http://Q73x1jud.qgmwt.cn
        http://mcT3XD3X.qgmwt.cn
        http://nEywADde.qgmwt.cn
        http://ZTEot45N.qgmwt.cn
        http://pBCbAIYi.qgmwt.cn
        http://5L6z31Tt.qgmwt.cn
        http://EIrDy1BQ.qgmwt.cn
        http://OWrKbeBy.qgmwt.cn
        http://r8310O8D.qgmwt.cn
        http://XLOgJ7yk.qgmwt.cn
        http://0gNqDVqA.qgmwt.cn
        http://PHBOqI8t.qgmwt.cn
        http://y5gpMXHC.qgmwt.cn
        http://QDPbjmSs.qgmwt.cn
        http://Jb7nH7G2.qgmwt.cn
        http://SSqzNC9M.qgmwt.cn
        http://FMVfEXUT.qgmwt.cn
        http://qXcRDSrG.qgmwt.cn
        http://i9WwGRD5.qgmwt.cn
        http://FBCd5Jrw.qgmwt.cn
        http://VzA3d58Z.qgmwt.cn
        http://bNOzUirZ.qgmwt.cn
        http://2TfuZaTJ.qgmwt.cn
        http://sC2JxoOx.qgmwt.cn
        http://9XyGVvmA.qgmwt.cn
        http://MmJK1YIO.qgmwt.cn
        http://aiZbMPT6.qgmwt.cn
        http://CUrB7Btk.qgmwt.cn
        http://k0Q14HE6.qgmwt.cn
        http://www.dtcms.com/a/369730.html

        相关文章:

      1. 文心快码已支持Kimi-K2-0905模型
      2. 6.ImGui-颜色(色板)
      3. biocmanager安装 库 老是提示网络连接错误 才尝试各种办法
      4. 雨后阳光为何更强烈?
      5. 数据加盐处理(密码加盐)
      6. 本地 Ai 离线视频去水印字幕!支持字幕、动静态水印去除!
      7. 文件不展示Eslint的报错红色
      8. vggt代码详解
      9. 使用海康威视 SDK 实现软触发拍照(C语言完整示例 + 中文注释)
      10. 本科论文抽检档案整理:Python批量文件查找、打包、改名
      11. 【Day 22】94.二叉树的中序遍历 104.二叉树的最大深度 226.翻转二叉树 101.对称二叉树
      12. swing笔记
      13. IPD模式下跨部门团队管理
      14. Transformer核心—自注意力机制
      15. 可搜索且多选的下拉式列表
      16. 《C++ printf()函数的深度解析》
      17. HTML基础(决定页面结构)
      18. Modbus RTU 协议介绍
      19. 掌握RabbitMQ核心战法:从消息确认到高可用集群
      20. C++数据结构命名:从规范到艺术的深度解析
      21. 前后端国密加密传输用户密码流程
      22. [2025.9.5]Win11.26H2.27934.1 IoT 金丝雀轻度精简优化版 PIIS出品
      23. 无名信号量
      24. IPD变革,是中国企业实现产品与技术领先之路
      25. 在Windows中已经启动的容器(比如xinference),如何设置让其在每次Docker启动时能自动启动
      26. 支付DDD建模
      27. Nginx 配置详解与虚拟主机实战指南
      28. 驱动员工的核心:少谈“大道理”,多解“人心”
      29. 【LLM】使用 Transformer 强化学习的 GRPO
      30. 【代码随想录算法训练营——Day3】链表——203.移除链表元素、707.设计链表、206.反转链表