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应用,主要特点:部署简单、操作简洁、功能快速。 新增特…...
Bongo-Cat-Mver:实时键盘动画工具的创新应用与实践指南
Bongo-Cat-Mver:实时键盘动画工具的创新应用与实践指南 【免费下载链接】Bongo-Cat-Mver An Bongo Cat overlay written in C 项目地址: https://gitcode.com/gh_mirrors/bo/Bongo-Cat-Mver 在直播、教学和演示场景中,如何让观众清晰感知键盘操作…...
CentOS7系统维护终止后YUM源失效的解决方案
1. CentOS7维护终止带来的YUM源危机 去年夏天我给客户部署的CentOS7服务器突然无法安装新软件,屏幕上不断弹出"无法解析主机"的错误。这才意识到官方已经停止维护,默认的YUM源就像突然关门的超市,所有货架都空了。对于仍在使用Cent…...
Linux栈机制解析:进程栈、线程栈与内核栈
Linux系统中的栈机制深度解析:进程栈、线程栈、内核栈与中断栈1. 栈的基本原理与硬件实现栈(Stack)是一种后入先出(LIFO)的串列数据结构,在计算机体系结构中具有重要作用。硬件层面,大多数处理器架构都实现了专门的栈机制:栈指针寄…...
深入Linux tcpm框架:从FUSB302芯片看PD协议兼容性那些‘坑’
深入Linux tcpm框架:从FUSB302芯片看PD协议兼容性那些‘坑’ Type-C接口凭借其强大的供电能力和灵活的数据传输特性,已成为现代电子设备的标配。然而,在Linux系统中实现完美的PD协议兼容性,却是一场充满技术陷阱的冒险。本文将带您…...
实战指南:如何为你的应用选择最优Cache替换算法(附性能对比)
实战指南:如何为你的应用选择最优Cache替换算法(附性能对比) 在构建高性能应用时,缓存系统的设计往往是决定整体性能的关键因素之一。想象一下,一个电商网站在大促期间,每秒需要处理数十万次商品详情查询&a…...
ESP32 BLE MTU 协商实战:从原理到手机端配置优化
1. 理解BLE MTU协商的核心概念 第一次接触BLE开发时,我也被MTU这个概念搞得一头雾水。简单来说,MTU(Maximum Transmission Unit)就像快递包裹的尺寸限制 - 它决定了每次传输能携带多少数据。在BLE通信中,默认的MTU只有…...
GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战
GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战 1. 认识MAI-UI-8B:你的GUI自动化助手 MAI-UI-8B是一款专为图形用户界面(GUI)操作设计的智能体,它能像人类一样"看"屏幕、"理解"界面元素并执行操作。想象一下&…...
Windows 11 + Ubuntu 20.04双系统安装避坑指南(附分区方案)
Windows 11与Ubuntu 20.04双系统安装全流程精解 对于想要在现有Windows 11系统上体验Ubuntu的用户来说,双系统安装是最佳选择。这种方式既能保留熟悉的Windows环境,又能探索Linux世界的无限可能。本文将详细解析从准备到安装的完整流程,特别针…...
BGE-Reranker-v2-m3批量处理优化:提升高并发排序效率
BGE-Reranker-v2-m3批量处理优化:提升高并发排序效率 你是不是也遇到过这样的问题?在搭建RAG系统时,向量检索返回了一大堆文档,但真正相关的却没几个。大模型拿着这些“噪音”文档生成答案,结果要么答非所问ÿ…...
如何用SlopeCraft实现Minecraft地图艺术创作:5个实用技巧
如何用SlopeCraft实现Minecraft地图艺术创作:5个实用技巧 【免费下载链接】SlopeCraft Map Pixel Art Generator for Minecraft 项目地址: https://gitcode.com/gh_mirrors/sl/SlopeCraft 在Minecraft的方块世界中,将现实图像转化为立体地形艺术曾…...
