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

react性能优化

memo

如下所示例子中,因为App内部状态的更新,总会牵连其无辜子组件Demo的更新。

const Demo = () => {console.log('Demo render');return (<div>我是子组件</div>);
};const App = () => {console.log('App render');const [count, setCount] = useState(0);const doInc = () => {setCount(count + 1);};return (<><div>{count}</div><button onClick={doInc} className='bg-blue-400 p-1 rounded text-white'>改变组件</button><hr className='mt-2'/><Demo /></>);
};

600

如何避免呢? 其实官方已经提供了这个优化的方案,那就是使用memo,你仅仅且包裹住这个组件即可!

const Demo = memo(() => {console.log('Demo render');return (<div>我是子组件</div>);
});

memo的作用就是对比组件重新render前后的 **props是否发生变化*:如果没有发生变化,则不会重新render。
但是注意他仅比较基本类型,如果是对象则会比较引用地址,如下则每次还都会重新render:

const Demo = memo((props) => {console.log('Demo render');return (<div>我是子组件</div>);
});const App = () => {console.log('App render');const [count, setCount] = useState(0);const doInc = () => {setCount(count + 1);};const info = {title: '子组件'};return (<><div>{count}</div><button onClick={doInc} className='bg-blue-400 p-1 rounded text-white'>改变组件</button><hr className='mt-2'/><Demo info={info}/></>);
};

原因也很简单,因为每次App组件的重新render,就会导致info是一个新创建的对象,引用地址自然就不同了!
解决办法:使用useMemo包裹住这个对象即可,这样这个对象就会被缓存下来不会被App重建!

const Demo = memo((props) => {console.log('Demo render');return (<div>我是子组件</div>);
});const App = () => {console.log('App render');const [count, setCount] = useState(0);const doInc = () => {setCount(count + 1);};const info = useMemo(()=>({title: '子组件'}),[]);return (<><div>{count}</div><button onClick={doInc} className='bg-blue-400 p-1 rounded text-white'>改变组件</button><hr className='mt-2'/><Demo info={info}/></>);
};

tips: useMemo一般用于缓存对象,如果是函数react还提供了useCallback,作用一样!

http://www.zskr.cn/news/10818.html

相关文章:

  • Gitee如何重塑中国开发者的代码托管体验
  • 模块化面向对象 2章
  • Debezium + Kafka + Flink/Doris Stream Load 实时数仓
  • 实用指南:【Makefile】Linux内核模块编译
  • Gitee DevOps平台:中国企业数字化转型的代码管理新范式
  • 幂运算与航班中转的奇妙旅行:探索算法世界的两极 - 实践
  • 论Linux安装后需要进行的配置
  • 51单片机-驱动DS1302时钟芯片模块教程 - 实践
  • 数组和链表读取、插入、删除以及查找的区别
  • 在K8S中,日志分析工具有哪些可以与K8S集群通讯?
  • 【2025最新教程】Claude Code国内使用_保姆级新手安装使用教程_最强AI编程工具
  • 如何计算sequence粒度的负载均衡损失 - 教程
  • P13885 [蓝桥杯 2023 省 Java/Python A] 反异或 01 串
  • 西电PCB设计指南第3章学习笔记
  • Vitrualbox、kali、metaspolitable2下载安装
  • llm入门环境
  • 借助Aspose.HTML控件,使用 Python 编辑 HTML
  • 汽车视频总线采集过程中,如何兼顾响应速度和可靠性?
  • 2025年十大好用网盘推荐:功能、口碑与性价比大对比
  • 使用 Ansible 批量安装 Docker
  • 二十一、DevOps:从零建设基于K8s的DevOps平台(二)
  • 新手项目经理如何选工具?2025年这5款上手快、不复杂的项目管理软件适合你
  • 用DiskGenius重新分区,检测出U盘虚标容量。
  • 2025低空经济时空信息平台
  • CF2147G
  • 全栈开发者效率工具图谱:从IDE到云服务的最优组合 - 指南
  • 遥感影像处理利器:PCL Geomatica 2018 功能与安装指南
  • EaseUS Partition Master 13.8 技术员版功能介绍与安装教程
  • VUE + Nginx + Traefik 项目的发布与反向代理
  • CF *3500