React性能优化之Memo、useMemo
文章目录
- React.memo
- 两种方式
- 参数
- 应用场景
- 拓展
- useMemo
- useMemo(calculateValue, dependencies)
- 参考资料
React.memo
React 的渲染机制,组件内部的 state 或者 props 一旦发生修改,整个组件树都会被重新渲染一次,即时子组件的参数没有被修改,甚至无状态组件
会造成性能浪费
React.memo 是 React 官方提供的一个高阶组件,用于缓存我们的需要优化的组件
React 中的组件被设计为在状态或 props 值发生变化时重新渲染。但是,这可能会影响应用程序的性能,因为即使更改只是为了影响父组件,附加到父组件的所有其他子组件都将重新呈现。当父组件重新渲染时,其所有子组件也会重新渲染。
React Memo 是一个高阶组件,它包装组件以记忆渲染的输出并避免不必要的渲染。这提高了性能,因为它会记住结果并跳过渲染以重用上次渲染的结果。
已经记忆化的组件,怎么触发更新
- 即使一个组件被记忆化了,当它自身的状态发生变化时,它仍然会重新渲染。memoization 只与从父组件传递给组件的 props 有关。
- 即使组件已被记忆化,当其使用的 context 发生变化时,它仍将重新渲染。记忆化只与从父组件传递给组件的 props 有关。
- useMemo
- 见拓展(下面)
- 自定义比较函数(见Memo参数-第二个参数,下面)
两种方式
- 直接创建(类式创建)
const myComponent = React.memo((props) => {/* render using props */ }); export default myComponent; - 函数组件
const myComponent = (props) => {/* render using props */};export const MemoizedComponent = React.memo(myComponent);
仅当 props 值发生变化或组件的状态和上下文发生变化时,memo组件才会重新渲染
参数
React.memo(Component, arePropsEqual?)
- Component
组件 - arePropsRqual
可选参数,为一个函数
接受两个参数:一个函数,接受两个参数:组件的前一个 props 和新的 props。如果旧的和新的 props 相等,即组件使用新的 props 渲染的输出和表现与旧的 props 完全相同,则它应该返回 true。否则返回 false。通常情况下,你不需要指定此函数。默认情况下,React 将使用 Object.is 比较每个 prop。
function MyComponent(props) {/* 使用 props 渲染 */
}
function shouldMemo(prevProps, nextProps) {/*如果把 nextProps 传入 render 方法的返回结果与将 prevProps 传入 render 方法的返回结果一致则返回 true,否则返回 false*/
}
export default React.memo(MyComponent, shouldMemo);
应用场景
-
当props没有改变时跳过重新渲染
-
使用state更新记忆化(memoized)组件
切记,不可以普遍使用该组件,不能都进行缓存,太多缓存,会造成负优化
拓展
useMemo
useMemo(calculateValue, dependencies)
在组件的顶层调用 useMemo 来缓存每次重新渲染都需要计算的结果,它在每次重新渲染的时候能够缓存计算结果
const cachedValue = useMemo(calculateValue, dependenies)
- calculateValue
要缓存计算的函数。之后组件更新,如果dependenies没有发生变化,React将直接返回相同值。否则,将会再次调用calculateValue并返回最新结果,然后进行缓存以便下次进行使用。 - dependenies
跟一般钩子的依赖项作用一样
参考资料
官网
掘金
相关文章:
React性能优化之Memo、useMemo
文章目录 React.memo两种方式参数应用场景 拓展useMemouseMemo(calculateValue, dependencies) 参考资料 React.memo React 的渲染机制,组件内部的 state 或者 props 一旦发生修改,整个组件树都会被重新渲染一次,即时子组件的参数没有被修改&…...
IDEA开启并配置services窗口
前言: 一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时,如果要调试测需要依次启动各个项目比较麻烦。 方法一: 默认第一次打开项目的时候,idea会提示是否增加这个选项卡,如果你没…...
vue2企业级项目(三)
vue2企业级项目(三) 引入mockjs,i18n 1、mockjs 项目下载依赖 npm install --save-dev mock根目录创建mock文件夹,并创建mock/index.js import Mock from "mockjs";// 设置全局延时 没有延时的话有时候会检测不到数据…...
QT 在label上透明绘图
一、新建TransparentDemo工程 二、在界面上添加label,修改样式表,将底色置为红色,作为北京 三、新建一个TransparentLabel类,继承自QLabel 此时,工程包括文件 五、在transparentlabel.h中添加 头文件 #include …...
SAM(Segment Anything)大模型论文汇总
A Comprehensive Survey on Segment Anything Model for Vision and Beyond 论文:https://arxiv.org/abs/2305.08196 25页综述,198篇参考文献!52个开源项目!本文第一个全面回顾了分割一切模型(SAM)的研究和应用进展,…...
金融翻译难吗,如何做好金融翻译?
我们知道,金融翻译涉及企业经济这块的,是影响各公司发展很重要的一方面,翻译做得好,可以促进公司内外的交流,及时掌握各种信息,做好应对。那么,金融翻译难吗,如何做好金融翻译&#…...
Java面试题(Tomcat与Nginx)
Tomcat 什么是Tomcat? 简单来说是一个运行Java的网络服务器,也是jsp和serlvet的一个容器 Tomcat的缺省端口是多少,怎么修改? conf文件夹下修改server.xml文件 <Connector connectionTimeout"20000" port"8080" p…...
React-使用mobx
React 中使用 mobx 配置开发环境 安装mobx和中间件工具 mobx-react-lite 只能函数组件中使用 yarn add mobx mobx-react-lite初始化 mobx 定义数据状态 state在构造器中实现数据响应式处理 makeAutoObservble定义修改数据的函数 action实例化 store 并导出 import { compute…...
LeetCode ACM模式——哈希表篇(一)
刷题顺序及部分思路来源于代码随想录,网站地址:https://programmercarl.com 部分思路来源于力扣官方题解,作者主页:https://leetcode.cn/u/leetcode-solution/ 242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个…...
WPF实战学习笔记31-登录界面全局通知
UI添加消息聚合器 <md:Snackbarx:Name"LoginSnakeBar"Grid.ColumnSpan"2"Panel.ZIndex"1"MessageQueue"{md:MessageQueue}" />注册提示消息 文件:Mytodo.Views.LoginView.cs构造函数添加内容 //注册提示消息 aggre…...
通用商城项目(中)
金山编译器出问题了。下面段落标号全出问题了,排版也出问题了。懒得改了。 使用对象存储OSS,保存品牌logo 新建Module,提供上传、显示服务 有些不明所以的,按照steinliving-commodity配置了一通pom.xml 新建application.yml&…...
谨慎使用JSON.stringify
谨慎使用JSON.stringify 为了避免因为对象是引用类型而造成的数据源污染,我们通常使用 JSON.stringify 将其转换为字符串,而后通过JSON.parse方法将字符串转化一个新对象来实现深拷贝。但是在这个过程中也会存在一些问题,本文就介绍一下使用…...
驱动开发day8
编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制LED亮灭 2.按键1 按下,led1电位反转 按键2按下,led2电位反转 按键3 按下,led3电位反转 驱动程序 #include <linux/init.h> #i…...
CAS 机制
问题分析与思考: CAS 是 Java 中 Unsafe 类里面的方法,它的全称是 CompareAndSwap,比较并交换 的意思。 它的主要功能是能够保证在多线程环境下,对于共享变量的修改的原子性。 举个例子,比如说有这样一个场景ÿ…...
#P1003. [NOIP2009普及组] 道路游戏
题目描述 小新正在玩一个简单的电脑游戏。 游戏中有一条环形马路,马路上有 nn 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接。小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn 个机器人工厂编号为 1\sim n1∼n,因…...
python-网络爬虫.regular
regular 正则表达式 (regular expression) 正则表达式(regular expression)描述了一种字符串匹配的模式 (pattern), 可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串 中取出符合某个条件的子串等。 正则表达式是由普通…...
手动搭建gateway,项目集成gateway实现Token效果
目录 背景步骤1、首先创建springboot项目2、引入依赖3、配置文件!!!!!(超级重要!!!根据自己的需要进行配置)4、相关类我们在服务中进行的白名单中接口的操作如…...
linux下SVN服务器搭建
在本教程中,我们将介绍如何在Linux系统下搭建Subversion(SVN)服务器。Subversion是一种流行的版本控制系统,它允许多个人在同一项目上进行协作,同时避免了他们各自的更改发生冲突。 安装SVN 在大多数Linux发行版中&am…...
技术等级 TRL 定义
“不同环境、不同目标下TRL表述不一样” 技术等级 TRL 定义 TRL1 基本原理提出和发现 TRL2 技术应用研究 TRL3 完成概念验证,如叶栅试验、燃烧室头部试验等 TRL4 完成模拟部件试验.如压气机性能试验,燃烧室扇形试验 TRL5 完…...
DHorse v1.3.0 发布,基于k8s的发布平台
综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用,主要特点:部署简单、操作简洁、功能快速。 新增特…...
2026年小白程序员必看:5项吃香AI技能,助你薪资翻倍(建议收藏)
2026年小白程序员必看:5项吃香AI技能,助你薪资翻倍(建议收藏) 随着AI大模型重构职场规则,掌握相关技能将极大提升工作效率和薪资。本文为小白和程序员推荐了5项最吃香的AI技能:RAG、提示词工程、多模态大模…...
Miniblink49深度解析:如何用6MB浏览器内核重构你的桌面应用架构
Miniblink49深度解析:如何用6MB浏览器内核重构你的桌面应用架构 【免费下载链接】miniblink49 a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核,用来取代wke和libcef 项目地址: https://git…...
深入AD9361:除了QPSK和FM,这颗射频芯片在Zynq平台上还能玩出什么花样?
深入AD9361:解锁Zynq平台上的射频创新潜能 当工程师们首次接触AD9361这颗射频芯片时,往往会被其标准应用场景如QPSK调制或FM收音所吸引。然而,这颗高度集成的RF收发器IC的真正价值,在于它为Zynq PSPL架构带来的无限可能性。本文将…...
基于Apify与AI模型的产品安全风险智能识别系统构建指南
1. 项目概述:一个面向产品安全与消费者风险管理的智能工具最近在梳理一些供应链和电商合规的项目时,我反复被一个核心痛点困扰:如何系统性地、自动化地识别和评估海量商品信息中潜藏的消费者风险?无论是作为平台方的风控团队&…...
如何在3分钟内配置你的英雄联盟本地自动化助手:终极指南
如何在3分钟内配置你的英雄联盟本地自动化助手:终极指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄排位赛中因…...
面向AI系统的非功能测试:公平性、可解释性与鲁棒性验证
一、引言:当“功能正确”不再是终点在软件测试的早期时代,我们的职责边界相对清晰——功能符合需求文档、性能达到指标、界面无错别字,测试便可宣告完成。然而,当AI系统从实验室的象牙塔走向社会决策的核心地带,这套传…...
React应用部署实战:Nginx配置与性能调优
1. React应用部署前的准备工作 第一次部署React应用到生产环境时,我踩过不少坑。记得有个项目上线后,用户反馈页面加载特别慢,排查后发现是静态资源没有做任何优化。从那以后,我养成了部署前必须做好三项准备工作的习惯。 首先是项…...
ARM架构BRBSRCINJ_EL1寄存器解析与分支记录调试
1. ARM架构中的分支记录缓冲区概述在ARMv8.4架构中引入的分支记录缓冲区(Branch Record Buffer, BRB)是一项重要的调试和性能分析功能。作为FEAT_BRBE扩展的核心组件,BRB能够自动记录程序执行过程中的分支指令信息,为开发者提供程序控制流的详细视图。BR…...
番茄小说下载器完整指南:如何快速搭建个人离线图书馆
番茄小说下载器完整指南:如何快速搭建个人离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否厌倦了每次阅读小说都要依赖网络?是否想要将…...
2026年青岛GEO优化服务商TOP5,哪家性价比最高?
行业痛点分析青岛地区GEO(生成式引擎优化)领域面临显著的技术挑战。据行业调研显示,超65%的本地企业存在“错配展现”问题,非目标区域消耗了20%以上的营销预算,导致获客成本平均上升30%。同时,AI大模型&…...
