react性能优化

news/2025/9/24 12:54:29/文章来源:https://www.cnblogs.com/dingshaohua/p/19109024

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.mzph.cn/news/915723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从研发效能到知识中枢:Gitee Wiki如何重塑企业知识管理范式

从研发效能到知识中枢:Gitee Wiki如何重塑企业知识管理范式 在数字化浪潮席卷全球的当下,企业知识管理正经历着从简单文档存储向智能中枢的范式转变。某研发团队经过长达两年的实践探索,对Notion、Confluence和Gite…

站点建错了网页能打开吗ps做网站首页

推荐一个学习资源&#xff1a;数据结构与算法之美。主要包括以下几个学习内容&#xff1a; 20个经典数据结构与算法100个真实项目场景案例文科生都能看懂的算法手绘图解轻松搞定BAT的面试通关秘籍 作者&#xff1a;王争 前谷歌工程师 内容很强。扫描我的二维码买的话&#x…

全国房地产网站如何运营一个公众号

MySql索引(二) 转自&#xff1a; http://www.cnblogs.com/dreamhome/archive/2013/04/16/3025304.html 所有MySQL列类型可以被索引。根据存储引擎定义每个表的最大索引数和最大索引长度。 所有存储引擎支持每个表至少16个索引&#xff0c;总索引长度至少为256字节。大多数存储引…

金华建设二建哪个网站报名商洛微网站建设

搜索AI伙伴 申请到了百度的chatgpt&#xff1a; 完整的窗口布局&#xff1a; 三个哲学问题&#xff1a; 灵感中心&#xff1a; 请做一副画&#xff0c;一个渔夫&#xff0c;冬天&#xff0c;下着大雪&#xff0c;在船上为了一家的生计在钓鱼&#xff0c;远处的山上也都是白雪&a…

Gitee DevSecOps平台:军工软件研发的智能化革命

Gitee DevSecOps平台:军工软件研发的智能化革命 军工行业正经历着数字化转型的关键时期,软件研发的工业化进程已成为提升国防科技实力的重要突破口。在这一背景下,Gitee DevSecOps平台凭借其创新的智能版本管理体系…

靠谱的程序员推荐阅读-----《阿里Java开发手册》【强制】所有的覆写方法,必须加@Override注解

靠谱的程序员推荐阅读----->《阿里Java开发手册》【强制】所有的覆写方法,必须加@Override注解将程序错误前置扼杀在编译期,是这个规约对我们开发者带来的最大的收益。《阿里巴巴Java开发手册》编程规约->OOP规…

杆状病毒表达系统为何成为蛋白表达首选

杆状病毒表达系统为何成为蛋白表达首选在现代生命科学、疫苗开发、生物医药以及结构生物学等领域,获取足够量、正确折叠、具有生物活性并带有适当后翻译修饰(post-translational modifications, PTMs)的蛋白,是许多…

日记3

卡壳在ArrayList和LinkedList的区别上,查资料+写测试代码后才理清:前者查数据快(像数组翻书),后者增删快(像串珠子)。 还练了道集合遍历题,用增强for循环时少写冒号报了错,调试后才想起语法格式。最后整理了两…

Gitee如何重塑中国开发者的代码托管体验

Gitee如何重塑中国开发者的代码托管体验 在数字化转型浪潮席卷全球的今天,代码托管平台作为开发者生态的基础设施,其重要性日益凸显。作为国内领先的代码托管服务提供商,Gitee凭借其本地化创新优势,正在重新定义中…

模块化面向对象 2章

1 抽象的目的是通过把相关的属性和其他不相关的属性分开,分离关注点 2 在面向对象设计中,普遍采用的包括描述程序静态结构的类图、描述程序动态行为的活动图。他们掩藏了类中方法的实现细节,凸出来类的组成和类之间…

完整教程:ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义(GLSL)修改高亮图层样式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

css `isolation: isolate` - 详解

css `isolation: isolate` - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

南昌网站建设一般多少钱一年视差效果网站

Java NIO 一&#xff0c;介绍 Java NIO&#xff08;New IO&#xff09;是 JDK 1.4 引入的一组新的 I/O API&#xff0c;用于支持非阻塞式 I/O 操作。相比传统的 Java IO API&#xff0c;NIO 提供了更快、更灵活的 I/O 操作方式&#xff0c;可以用于构建高性能网络应用程序。 …

建设一个网站需要多久文创产品设计流程

【vue在主页中点击主页面跳转到某个页面的操作完整过程】 1.首先在主页面中加入一个卡槽用于展示弹出的窗口 代码如下&#xff1a; <el-dialog :visible.sync"dialogVisible1" :close-on-click-modal"false" :title"title" class"dial…

Debezium + Kafka + Flink/Doris Stream Load 实时数仓

通过 Debezium 捕获 Oracle 的 CDC(Change Data Capture)日志,经 Kafka 缓冲,再通过 Flink 或直接调用 Doris 的 Stream Load 接口写入 Doris。1、Oracle CDC 捕获: Debezium(基于 LogMiner 或 XStream)解析 Or…

实用指南:【Makefile】Linux内核模块编译

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

er图关于网站建设允许个人做动漫网站吗

1&#xff1a;音频信息数据量计算 已知采样频率&#xff08;单位KHz&#xff09;、量化位数、声道数及持续时间&#xff08;单位分钟&#xff09;&#xff0c;求未压缩时的数据量&#xff08;单位MB&#xff09;. 例如&#xff1a; 输入&#xff1a; 22.05 16 2 3 &#xff…

Gitee DevOps平台:中国企业数字化转型的代码管理新范式

Gitee DevOps平台:中国企业数字化转型的代码管理新范式 随着中国科技产业的蓬勃发展,国产代码托管平台Gitee正凭借其深度本土化能力和全栈式DevOps解决方案,成为企业研发数字化转型的重要推手。该平台不仅提供了与国…

Ansible + Docker 部署 Zookeeper 集群

Ansible + Docker 部署 Zookeeper 集群1. 服务器和集群信息 1.1 主机列表IP 主机名 内存(GB) CPU核数 磁盘 操作系统 CPU 架构 已安装软件10.0.0.13 arc-pro-dc01 my.registry.com 8 1 500GB CentOS 7.9.2009 x86_…

幂运算与航班中转的奇妙旅行:探索算法世界的两极 - 实践

幂运算与航班中转的奇妙旅行:探索算法世界的两极 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…