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

React.memo 和 useMemo

现象

React 中,通常父组件的某个state发生改变,会引起父组件的重新渲染(和其他state的重新计算),从而会导致子组件的重新渲染(和其他非相关属性的重新计算)

  • 问题一:如何避免因为某个state变化,导致组件的中其他属性(state)的重新计算?

       方案:useMemo

  • 问题二:如何避免因为父组件的重新渲染,导致子组件中非相关属性的重新计算?

       方案:React.memo

结论

总结起来就一句话:

React.memo 用来限制组件重新渲染,而 useMemo 用来限制组件中的部分变量重新计算

(前者主要针对组件的渲染,后者则侧重于组件内的计算)

示例

React.memo:【常用于子组件】

它是一个高阶组件(Higher-Order Component,HOC),用于包装函数组件

当父组件重新渲染时,往往会触发子组件的重新渲染。但很多时候子组件的 props 并没有改变,此时子组件的重新渲染就是不必要的,会造成性能浪费。

经过 React.memo 包装的组件,React 会对其 props 进行浅比较,如果新 props 和旧 props 相同,组件不会重新渲染,而是复用之前的渲染结果。(浅比较只会检查对象或数组的引用是否相同,而不会深入比较其内部的属性或元素)

import React from 'react';// 使用 React.memo 包裹组件
const MyComponent = React.memo(({ data }) => {console.log('组件重新渲染');return <div>{data}</div>;
});const ParentComponent = () => {const [count, setCount] = React.useState(0);const someData = '固定数据';return (<div>{/* 如果子组件不用React.memo包裹,count变化后子组件也会重新渲染 */}<button onClick={() => setCount(count + 1)}>增加计数</button>{/* 只要 someData 不变,MyComponent 不会重新渲染 */}<MyComponent data={someData} /></div>);
};export default ParentComponent;

useMemo

这是一个 React Hook,只能用于函数组件内部

它主要用于缓存计算结果,根据传入的依赖项数组来判断是否需要重新计算缓存的值,避免在每次组件渲染时都进行重复的高开销计算。

如果计算属性作为子组件的 props 传递,且子组件使用 React.memo 进行了优化,在父组件使用 useMemo 可以确保计算属性的引用在依赖项不变时保持稳定,从而避免子组件不必要的重新渲染。

import React, { useState, useMemo, memo } from 'react';const ChildComponent = memo(({ data }) => {console.log('ChildComponent rendered');return <div>{data}</div>;
});const ParentComponent = () => {const [num, setNum] = useState(1);const calculatedData = useMemo(() => {return num * 2;}, [num]);return (<div><inputtype="number"value={num}onChange={(e) => setNum(Number(e.target.value))}/><ChildComponent data={calculatedData} /></div>);
};export default ParentComponent;

这里 calculatedData 通过 useMemo 缓存,当 num 不变时,calculatedData 的引用保持不变,ChildComponent 不会因为 props 的引用变化而重新渲染。

顺便提一下【useCallback】:

当父组件向子组件传递一个函数作为 props,并且子组件使用 React.memo 包裹时,useCallback 可以确保该函数的引用在依赖项不变时保持稳定,从而避免子组件因为函数引用的改变而进行不必要的重新渲染。

import React, { useState, useCallback, memo } from 'react';// 使用 React.memo 包裹子组件
const ChildComponent = memo(({ onClick }) => {console.log('ChildComponent 渲染');return <button onClick={onClick}>点击我</button>;
});const ParentComponent = () => {const [count, setCount] = useState(0);// 使用 useCallback 缓存函数const handleClick = useCallback(() => {setCount(count + 1);}, [count]);return (<div><p>计数: {count}</p><ChildComponent onClick={handleClick} /></div>);
};export default ParentComponent;

相关文章:

React.memo 和 useMemo

现象 React 中&#xff0c;通常父组件的某个state发生改变&#xff0c;会引起父组件的重新渲染&#xff08;和其他state的重新计算&#xff09;&#xff0c;从而会导致子组件的重新渲染&#xff08;和其他非相关属性的重新计算&#xff09; 问题一&#xff1a;如何避免因为某个…...

命令行指引的尝试

效果 步骤 首先初始化一个空的项目&#xff0c;然后安装一些依赖 npm init -y npm install inquirer execa chalk ora至于这些依赖是干嘛的&#xff0c;如下图所示&#xff1a; 然后再 package.json 中补充一个 bin 然后再根目录下新建一个 index.js , 其中的内容如下 #!/…...

《深入理解计算机系统》阅读笔记之第三章 程序的机器级表示

概述 历史观点 程序编码 数据格式 访问信息 操作数指示符 数据传送指令 压入和弹出栈数据 算术和逻辑操作 小结 本章没有细看&#xff0c;其中主要以C语言中的一些汇编等知识来做介绍。算是一种对C语言的相关底层知识的详细介绍吧。但是从原理上理解我觉得《编码》这本书更好理…...

解析excel中的图片

解析excel中的图片 前言一、pom依赖二、使用步骤1.示例数据2.代码如下&#xff08;示例&#xff09;&#xff1a; 总结 前言 初始化数据是&#xff0c;需要将excel中的数据解析并插入数据库。 但是某几列存放的是图片&#xff0c;这时候怎么办呢。 主要解决的是&#xff1a;获…...

红队系列-网络安全知识锦囊-CTF(持续更新)

CTF CTF系列-AWD专题篇CTF-比赛培训基础1 CTF 介绍HTTP协议分析进阶001.CTF简介_宽字节注入高级 2018CTF——黑客大赛特训CTF-PWNPWNCTF竞赛中的主要题型之一了解CTF Capture The Flag 夺旗描述:# gets从标准输入设备读字符串函数#下面是对main函数中的汇编代码的解释:modifi…...

强化学习:基础理论与高级DQN算法及策略梯度基础

如果您想学习强化学习&#xff0c;我推荐David Sliver的讲座&#x1f60a;&#xff1a;RL Course by David Silver - Lecture 1: Introduction to Reinforcement Learning - YouTube 基础理论 马尔可夫决策过程&#xff08;MDP&#xff09; 1.MDP五元组定义 状态空间&#xf…...

如何修复宝可梦时时刻刻冒险无法正常工作

宝可梦的时时刻刻冒险模式是一项强大的功能&#xff0c;即使应用程序关闭&#xff0c;它也能追踪你的步行距离。它的工作原理是将你的步数与 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它对于孵化宝可梦蛋和赚取好友糖果至关重要&#xff0c;但一旦它停止工作&a…...

RAG5个常见错误

向量数据库并非硬性规定 几乎互联网上所有关于RAG的教程都使用向量存储。如果你一直在搜索RAG相关内容&#xff0c;你就会明白我们在说什么。 基于向量的检索无疑是RAG成功的重要因素。向量嵌入非常适合映射文本的语义含义。它们也能很好地处理不同大小的文本。你的查询可能只…...

VuePress可以做什么?

VuePress 可以做什么 VuePress 是一个基于 Vue.js 的静态站点生成器,专注于文档和内容展示。它结合了 Markdown 的简洁性和 Vue 的灵活性,适合多种场景的开发需求。以下是 VuePress 的主要用途和功能: 1. 技术文档网站 VuePress 最初是为编写 Vue.js 官方文档而设计的,因…...

TDengine 数据缓存技术

简介 在现代物联网&#xff08;IoT&#xff09;和工业互联网&#xff08;IIoT&#xff09;应用中&#xff0c;数据的高效管理对系统性能和用户体验至关重要。为了应对高并发环境下的实时读写需求&#xff0c;TDengine 设计了一套完整的缓存机制&#xff0c;包括写缓存、读缓存…...

如何成功防护T级超大流量的DDoS攻击

防护T级超大流量的DDoS攻击需要综合技术、架构与运营策略的多层次防御体系。以下是基于最新技术实践和行业案例总结的关键防护策略&#xff1a; 一、流量清洗与分布式处理 部署流量清洗中心 T级攻击的核心防御依赖于专业的流量清洗技术。通过部署分布式流量清洗集群&#xff0c…...

【Linux内核设计与实现】第三章——进程管理02

文章目录 7. 进程创建7.1. 进程之间的关系7.2. 进程创建的写时拷贝机制&#xff08;copy-on-write&#xff09;7.3. fork() 函数的入口7.4. 创建新进程的核心函数 kernel_clone()7.4.1. 检查参数并调用 copy_process 创建并复制进程7.4.2. 获取新进程 PID 作为返回值7.4.3. 唤醒…...

企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录

简介 Power BI Report Server 简称PBIRS&#xff0c;中文名"Power BI 报表服务器" 微软的文档&#xff1a;Power BI 报表服务器文档 - Power BI | Microsoft Learn 借用官网的介绍&#xff1a; Power BI 报表服务器类似于 SQL Server Reporting Services 和 Power BI…...

Leetcode 2845 题解

还是要把自己做题的思路写出来的&#xff0c;但是结果可能还是得去观摩一下题解&#xff0c;无论是大佬写的题解还是leetcode官方写的题解&#xff0c;看完题解后再去反思才能有收获&#xff0c;即使下次遇见一样的题不见得能写出来&#xff0c;但有思路比没思路更重要。 今天写…...

前端基础之《Vue(12)—插件封装》

一、插件封装 1、在Vue生态中&#xff0c;除了Vue本身&#xff0c;其它所有的与Vue相关的第三方包&#xff0c;都是插件 例子&#xff1a; import VueRouter form vue-router Vue.use(VueRouter) // 注册插件 2、如何封装Vue插件 &#xff08;1&#xff09;第一种写法 const…...

arcpy列表函数的应用(2)

arcpy.ListRasters() 该函数用于列出指定工作空间中的所有栅格数据集。 语法&#xff1a; python arcpy.ListRasters(wild_cardNone, raster_typeNone)• wild_card&#xff1a;用于筛选栅格数据集名称的通配符。 • raster_type&#xff1a;用于筛选栅格数据集的类型&…...

智能电网第7期 | 断网不断控:电力监控网络高可靠通信解决方案

随着智能电网建设加速推进&#xff0c;电力监控系统的可靠性已成为保障电网安全运行的核心要素。在变电站、配电房等关键场景中&#xff0c;网络中断可能导致监控失效、故障扩大等严重后果。当前电力通信网络面临的主要挑战包括&#xff1a; 网络脆弱性&#xff1a;单一链路故障…...

Nacos简介—2.Nacos的原理简介

大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…...

offset voltage of Comparator

静态失调电压&#xff08;static offset voltage&#xff09; 主要影响因素&#xff1a;μCox(载流子传输速率和栅氧层电容的的乘积)、阈值电压。 静态失配方差与器件尺寸成反比&#xff0c;可以增大关键对mos管的尺寸 动态失调电压&#xff08;dynamic offset voltage&…...

Spring-Ai-McpSever从外到内

MCP是什么 Model Context Protocol (MCP) 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义的 AI 工作流&#xff0c;MCP 提供了一种标准化的方式&#xff0c;将 LL…...

Vue多地址代理端口调用

第一种方法 config.ts文件 配置多条代理服务端口 如下所示:proxy: {/app: {// 其他的端口target: http://125.124.5.117:12877/,changeOrigin: true}/api: {//默认的端口// http://192.168.31.53:5173/target: http://192.168.31.199:18777/,changeOrigin: true,rewrite: pat…...

Android APP 热修复原理

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ dexElements Android 的 ClassLoader&#xff08;如 PathClassLoader、DexClassLoader&#xff09;内部结构如下&#xff1a; BaseDexClassLoader└── pat…...

一些有关ffmpeg 使用(1)

1 解封装流程 1.1 什么解封装 封装的逆向操作&#xff1a;封装是把音频流、视频流、字幕流等不同成分按一定规则组合成视频文件&#xff08;如 MP4、FLV &#xff09;&#xff0c;复用器负责此过程。解封装则相反&#xff0c;是用解复用器&#xff08;针对 MP4、FLV 等格式有…...

Postman-win64-7.2.2 安装教程(Windows 64位详细步骤)

1. 下载安装包 Postman-win64-7.2.2-Setup.exe下载链接&#xff1a;https://pan.quark.cn/s/6b48480d95d5 2. 运行安装程序 双击下载的 .exe 文件&#xff0c;启动安装向导。 若系统提示权限确认&#xff0c;点击 “是” 允许安装。 3. 安装向导设置 选择安装选项&#xff0…...

C语言实现贪心算法

一、贪心算法核心思想 特征&#xff1a;在每一步选择中都采取当前状态下最优&#xff08;局部最优&#xff09;的选择&#xff0c;从而希望导致全局最优解 适用场景&#xff1a;需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标&#xff1a…...

Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构

本文是博主在部署项目时发现的一个小技巧&#xff0c;项目部署在 Linux 虚拟机上&#xff0c;数据库被设置了写权限&#xff0c;作为开发只能使用程序对数据库做增删改查&#xff0c;但是在开发测试阶段会出现很多问题&#xff0c;权限的问题大大降低了开发效率&#xff0c;所以…...

Java对象转换的多种实现方式

Java对象转换的多种实现方式 在Java开发中&#xff0c;对象转换是一个常见的需求。特别是在不同层次间传递数据时&#xff0c;通常需要将一个对象转换为另一个对象。虽然JSON序列化/反序列化是一种常见的方法&#xff0c;但在某些场景下可能并不是最佳选择。本文将总结几种常见…...

详解 LeetCode 第 242 题 - 有效的字母组

目录 题目描述 解题思路 代码分析 步骤说明 图解原理 优势分析 小结 码题目&#xff1a;LeetCode 242. 有效的字母组 题目描述 给定两个字符串 s 和 t&#xff0c;请判断是否为字母组&#xff08;Anagram&#xff09;。 如果 t 是通过打乱 s 的字符并重新排列所得到的…...

【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串

题目要求 给定一个字符串 s&#xff0c;找出其中不含有重复字符的最长子串的长度。 子字符串是字符串中连续非空字符序列。 示例 1 输入&#xff1a;s "abcabcbb" 输出&#xff1a;3 解释&#xff1a;无重复字符的最长子串是 "abc"&#xff0c;长度为…...

springmvc-拦截器

目录 一&#xff0c;拦截器的职责 二&#xff0c;拦截器的应用场景 三&#xff0c;拦截器的工作原理 拦截器在Spring MVC请求处理流程中的位置&#xff1a; 四&#xff0c;使用拦截器 一 &#xff0c;编写拦截类&#xff0c;实现HandlerInterceptor接口&#xff0c;重写方…...

【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理

LangManus深度解析&#xff1a;AI自动化框架的技术演进与实践 本文将带你深入探索LangManus这一AI自动化框架的核心技术与其基于langgraph的实现原理&#xff0c;并与OpenManus进行全面对比&#xff0c;助你掌握多智能体系统的前沿技术。 本文3万字&#xff0c;没有时间的话可以…...

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)

一、增益带宽积&#xff08;GBP&#xff09;的测量 定义&#xff1a;增益带宽积是运算放大器的开环增益下降到直流增益的 ​&#xff08;即 - 3dB&#xff09;时对应的频率与该频率下增益的乘积&#xff0c;数学表达式为&#xff1a; 其中 A0​ 是直流开环增益&#xff0c;f0​…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

ElementUi的Dropdown下拉菜单的详细介绍及使用

Dropdown是 ElementUI 中用于创建下拉菜单项的一个组件&#xff0c;通常el-dropdown-item 包裹在 el-dropdown 组件中使用。以下从功能特性(一些属性及方法)、使用和高级功能(高亮显示&#xff0c;滚动&#xff0c;额外传参数)三个方面进行详细介绍。 一、功能特性 1.触发方式…...

C++类模板编程练习(从基础到进阶)

一、基础模板类设计 泛型盒子&#xff08;Box&#xff09; 实现一个 Box 类模板&#xff0c;存储任意类型的值&#xff0c;并提供获取/修改方法。 Box<int> intBox(42); cout << intBox.get(); // 输出 42 intBox.set(100);类型转换器&#xff08;Converter&…...

基于物联网的智能家居安全防护系统设计

资料下载地址&#xff1a;基于物联网的智能家居安全防护系统仿真&#xff08;仿真代码&#xff09; 目录 一、功能介绍 二、仿真图 三、程序 一、功能介绍 1.单片机和app、OneNet云平台通过wifi进行通信 2.马达模拟家里的用电设备&#xff0c;可通过按键开关 3.可检测用电量…...

android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计

Android Compose 多接口数据依赖管理&#xff1a;ViewModel 状态共享最佳实践 &#x1f4cc; 问题背景 在 Jetpack Compose 开发中&#xff0c;经常遇到以下场景&#xff1a; 页面由多个独立接口数据组成&#xff08;如 Part1、Part2&#xff09;Part2 的某些 UI 需要依赖 P…...

非序列实现MEMS聚焦功能

zemax非序列模式下有MEMS,但是没有对应的代码。无法修改成自己需要的功能 以下是实现MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…...

基于Java,SpringBoot,Vue,HTML宠物相亲配对婚恋系统设计

摘要 基于Java、SpringBoot、Vue和HTML的宠物相亲配对系统设计旨在为宠物主人打造一个高效、智能的宠物社交与配对平台。系统采用前后端分离架构&#xff0c;前端基于Vue.js框架结合HTML/CSS/JavaScript构建动态交互界面&#xff0c;实现宠物信息展示、用户社交互动等功能&…...

AI大模型学习十二:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio对象存储测试和漫长修改之路

一、说明 前面已经安装完成&#xff0c;这里我们测试对象存储 AI大模型学习十一&#xff1a;‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;实战运行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…...

身份与访问管理(IAM):零信任架构下的认证授权技术与实战

身份与访问管理&#xff08;IAM&#xff09;&#xff1a;零信任架构下的认证授权技术与实战 在网络安全防御体系中&#xff0c;身份与访问管理&#xff08;Identity and Access Management, IAM&#xff09;是守护数字资产的“数字门禁系统”。随着远程办公和多云架构的普及&a…...

潮了 低配电脑6G显存生成60秒AI视频 本地部署/一键包/云算力部署/批量生成

最近发现了一个让人眼前一亮的工具——FramePack&#xff0c;它能用一块普通的6GB显存笔记本GPU&#xff0c;生成60秒电影级的高清视频画面&#xff0c;效果堪称炸裂&#xff01;那么我们就把他本地部署起来玩一玩、下载离线一键整合包&#xff0c;或者是用云算力快速上手。接下…...

高防IP+CDN组合:电商大促的“双保险”防护方案

引言 电商大促期间&#xff0c;平台流量呈爆发式增长&#xff0c;既要应对瞬时激增的访问量&#xff0c;又要防范黑客趁机发起的DDoS攻击、恶意爬虫等威胁。单一防护手段往往难以兼顾性能与安全&#xff0c;而高防IPCDN组合通过“流量清洗加速分发”的双重机制&#xff0c;为电…...

“IAmMusicFont.com“:将音乐变成视觉

很高兴向大家介绍——IAmMusicFont.com&#xff0c;这是一个专为音乐爱好者和设计师打造的在线字体生成器&#xff0c;灵感源自Playboi Carti 2025年专辑《MUSIC》&#xff08;又称"I Am Music"&#xff09;的标志性封面设计。 什么是"I am music font"&a…...

C++入门(下)

本文为个人学习笔记&#xff0c;如有错误欢迎批评指正&#xff0c;如有侵权&#xff0c;请联系删除。 今日名言&#xff1a; 好运只是个副产品&#xff0c;只有当你不带任何私心杂念&#xff0c;单纯的去做事情时&#xff0c;他才会降临。 上一篇文章我们讲了C入门的一部分内容…...

ubuntu22.04 命令行修改静态ip

传统interfaces文件配置&#xff08;适用于旧版&#xff09;即便我们已经在桌面上配置了固定ip 这里也可以修改 ‌编辑配置文件‌ 修改/etc/network/interfaces&#xff08;需安装net-tools&#xff09;&#xff1a; # interfaces(5) file used by ifup(8) and ifdown(8) # In…...

Ubuntu18.04配置C++环境和Qt环境

Ubuntu18.04配置C环境和Qt环境 1、前言3.2 安装其他库3.3 查看有没有安装成功3.4测试C环境 4、配置Qt环境4.1 安装相关的库4.2 测试 5、总结 1、前言 记录一下Ubuntu18.04配置C环境和Qt环境的过程&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 # 2…...

深度学习--自然语言处理统计语言与神经语言模型

文章目录 前言一、语言转换方法1、数据预处理2、特征提取3、模型输入4、模型推理 二、语言模型1、统计语言模型1) 机器学习词向量转换2&#xff09;解释&#xff1a;3) 统计语言模型存在的问题 2、神经语言模型1&#xff09;one—hot编码2&#xff09;解决维度灾难3&#xff09…...

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…...