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

React中useMemo和useCallback的作用:

一、useMemo 基本用法:

useMemo 是 React 提供的一个 Hook,用于性能优化,它通过"记忆"(memoization)计算结果来避免在每次渲染时进行不必要的复杂计算。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

  主要作用:

  1. 避免重复计算
    当组件重新渲染时,useMemo 会检查依赖项数组中的值是否发生变化,只有当依赖项变化时,才会重新执行计算函数,否则直接返回之前缓存的值
  2. 优化渲染性能
    对于计算量大的操作,使用 useMemo 可以显著提高性能,避免在每次渲染时都执行昂贵的计算
  3. 保持引用稳定
    当返回对象或数组时,useMemo 可以保持引用不变(除非依赖项变化),这对于传递给子组件的 props 特别有用,可以避免不必要的子组件重新渲染

  使用场景:

   1. 复杂计算
function ExpensiveComponent({ a, b }) {const result = useMemo(() => {// 复杂的计算过程return a * b + Math.pow(a, b) - a / b;}, [a, b]); // 只有当a或b变化时才重新计算return <div>{result}</div>;
}
   2. 优化子组件渲染
function ParentComponent({ items }) {const processedItems = useMemo(() => {return items.map(item => ({...item,fullName: `${item.firstName} ${item.lastName}`}));}, [items]); // 只有当items变化时才重新处理return <ChildComponent items={processedItems} />;
}
   3. 避免不必要的对象/数组创建
function FormComponent({ onSubmit }) {const formConfig = useMemo(() => ({initialValues: { username: '', password: '' },validate: values => {const errors = {};if (!values.username) errors.username = 'Required';return errors;}}), []); // 空依赖数组表示只创建一次return <Form {...formConfig} onSubmit={onSubmit} />;
}

  注意事项:

  1. 不要滥用
    useMemo 本身也有性能开销,只对真正昂贵的计算或需要稳定引用的值使用
  2. 依赖数组
    确保包含所有在计算函数中使用的外部值,遗漏依赖项会导致 bug
  3. 不是语义保证
    React 可能在将来选择"忘记"某些记忆化的值,不要依赖 useMemo 来实现业务逻辑的正确性
  4. 与 React.memo 的区别
    useMemo 记忆的是值,React.memo 记忆的是组件

二、useCallback 基本用法:

  主要作用:

useCallback 是 React 提供的用于性能优化的 Hook,它的主要作用是缓存函数引用,避免不必要的函数重新创建。

  使用场景:

1. 当函数作为依赖项时
// 不使用 useCallback - 每次渲染都会创建新函数,导致 useEffect 重复执行
const fetchData = () => { /*...*/ };
useEffect(() => {fetchData();
}, [fetchData]); // 依赖项每次都会变化// 使用 useCallback - 只有依赖变化时才创建新函数
const fetchData = useCallback(() => {/*...*/
}, [dependency]); // 只有当 dependency 变化时才重新创建函数
2. 当函数作为 props 传递给优化过的子组件时
// 子组件用 React.memo 优化过
const Child = React.memo(({ onClick }) => {/*...*/
});function Parent() {// 不使用 useCallback - 每次渲染都会导致 Child 重新渲染const handleClick = () => { /*...*/ };// 使用 useCallback - 避免 Child 不必要的重新渲染const handleClick = useCallback(() => {/*...*/}, []); // 空依赖表示函数永不变化return <Child onClick={handleClick} />;
}
3. 在自定义 Hook 中返回稳定函数时
function useCounter() {const [count, setCount] = useState(0);// 返回稳定的函数引用const increment = useCallback(() => setCount(c => c + 1), []);const decrement = useCallback(() => setCount(c => c - 1), []);return { count, increment, decrement };
}

  具体使用时机

  1. 函数被包含在依赖数组(如 useEffectuseMemouseCallback 的依赖数组)中时

  2. 函数作为 prop 传递给用 React.memo 优化的子组件

  3. 函数被用作上下文值且会被多个组件使用时

  4. 函数被多次创建且创建成本较高时(虽然这种情况较少见)

  不需要使用 useCallback 的情况

  1. 函数不参与任何依赖关系(没有作为 prop 传递,不在依赖数组中)
  2. 函数定义非常简单且创建成本极低
  3. 组件本身很少重新渲染

三、useMemo与 useCallback 的关系:

 useCallback(fn, deps) 相当于 useMemo(() => fn, deps),两者都用于性能优化,但:

  1. useMemo 用于记忆计算结果
  2. useCallback 专门用于记忆函数
​// 这两个是等价的
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);
const memoizedCallback = useMemo(() => () => doSomething(a, b), [a, b]);

相关文章:

React中useMemo和useCallback的作用:

一、useMemo 基本用法: useMemo 是 React 提供的一个 Hook&#xff0c;用于性能优化&#xff0c;它通过"记忆"&#xff08;memoization&#xff09;计算结果来避免在每次渲染时进行不必要的复杂计算。 const memoizedValue useMemo(() > computeExpensiveValue…...

【Shell的基本操作】

文章目录 一、实验目的二、实验环境三、实验内容3.1 Shell变量与脚本基础3.2 定制终端提示符&#xff08;PS1变量&#xff09;3.3 文件查找与类型确认&#xff08;find命令&#xff09;3.4 管道命令实战&#xff08;用户登录统计&#xff09;3.5 交互式备份压缩脚本 四、总结4.…...

部署docker上的redis,idea一直显示Failed to connect to any host resolved for DNS name

参考了https://blog.csdn.net/m0_74216612/article/details/144145127 这篇文章&#xff0c;关闭了centos的防火墙&#xff0c;也修改了redis.conf文件&#xff0c;还是一直显示Failed to connect to any host resolved for DNS name。最终发现是腾讯云服务器那一层防火墙没…...

Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)

PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项&#xff0c;使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖&#xff1a; // pdfimplementation("com.github.bar…...

Linux 系统切换国内镜像源教程

在中国大陆使用 Linux 系统时&#xff0c;由于网络环境的原因&#xff0c;连接官方的软件包镜像源速度较慢&#xff0c;甚至可能出现连接失败的情况。此时&#xff0c;将系统配置为使用国内的镜像源可以显著提升软件包下载和更新的速度。 常见的国内镜像源 阿里云镜像站: htt…...

4.2.3 Thymeleaf标准表达式 - 2. 选择表达式

本实战通过 Thymeleaf 的选择表达式&#xff08;*{}&#xff09;演示了如何在模板中操作和展示对象的属性与方法。首先&#xff0c;在控制器中创建了一个 User 对象&#xff0c;并将其添加到模型中。接着&#xff0c;在 test2.html 模板中&#xff0c;通过 th:object 声明了对象…...

C#学习第23天:面向对象设计模式

什么是设计模式&#xff1f; 定义&#xff1a;设计模式是软件开发中反复出现的特定问题的解决方案。它们提供了问题的抽象描述和解决方案。目的&#xff1a;通过提供成熟的解决方案&#xff0c;设计模式可以加快开发速度并提高代码质量。 常见的设计模式 设计模式通常分为三大…...

【数据结构】二分查找-LeftRightmost

查找&#xff1a; Leftmost(最左侧重复元素) package 二分查找;public class BinarySearch {public static void main(String[] args) {// TODO Auto-generated method stub}public static int binarySearchBasic(int[] a,int target) {int i0,ja.length-1; //设置指针初值in…...

汽车装配又又又升级,ethernetip转profinet进阶跃迁指南

1. 场景描述&#xff1a;汽车装配线中&#xff0c;使用EtherNet/IP协议的机器人与使用PROFINET协议的PLC进行数据交互。 2. 连接设备&#xff1a;EtherNet/IP机器人控制器&#xff08;如ABB、FANUC&#xff09;与PROFINET PLC&#xff08;如西门子S7-1500&#xff09;。 3. 连…...

链表的中间结点数据结构oj题(力扣876)

目录 题目描述&#xff1a; 题目分析&#xff1a; 代码解决&#xff1a; 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目分析&#xff1a; 寻找中间节点这道题原理…...

LLM学习笔记(五)概率论

1. 随机变量与概率分布&#xff1a;模型输出的基础 在LLM中&#xff0c;随机变量最直观的体现就是模型预测的下一个token。每个时刻&#xff0c;模型都会输出一个概率分布&#xff0c;表示词汇表中每个token可能是"下一个词"的概率。 直观理解 想象模型在处理句子…...

归并排序:分治思想的优雅实现

归并排序&#xff08;Merge Sort&#xff09;以简洁而高效的分治思想&#xff0c;在众多排序算法中占据着重要的地位。今天&#xff0c;就让我们一同深入探索归并排序的奥秘。 一、归并排序简介 归并排序是一种基于分治策略的排序算法。它的核心思想是将一个大的问题分解成若…...

从小区到商场再到校园,AI智能分析网关V4高空抛物检测方案全场景护航

在城市化进程不断加速的背景下&#xff0c;高层建筑如雨后春笋般涌现&#xff0c;然而&#xff0c;高空抛物这一“悬在城市上空的痛”却严重威胁着人民群众的生命财产安全。传统的监控方式难以对高空抛物行为进行及时、准确地识别与预警&#xff0c;而AI智能分析网关V4搭载高空…...

WEB安全--Java安全--shiro550反序列化漏洞

一、前言 什么是shiro&#xff1f; shiro是一个Apache的Java安全框架 它的作用是什么&#xff1f; Apache Shiro 是一个强大且灵活的 Java 安全框架&#xff0c;用于处理身份验证、授权、密码管理以及会话管理等功能 二、shiro550反序列化原理 1、用户首次登录并勾选记住密码…...

现代计算机图形学Games101入门笔记(十一)

致敬两位大佬 面的细分、简化、正则化 Loop 不是循环&#xff0c;是这个算法的发明人家族名称是Loop. 新增点&#xff0c;白点是不更新前通过细分得到的点。通过加权平均4个点坐标&#xff0c;更新坐标就是最后细分点的坐标。 如果细分出新的点刚好在老点上。那一部分相信周围点…...

OAT 初始化时出错?问题可能出在 PAM 配置上|OceanBase 故障排查实践

本文作者&#xff1a;爱可生数据库工程师&#xff0c;任仲禹&#xff0c;擅长故障分析和性能优化。 背景 某客户在使用 OAT 初始化OceanBase 服务器的过程中&#xff0c;进行到 precheck 步骤时&#xff0c;遇到了如下报错信息&#xff1a; ERROR - check current session ha…...

现场血案:Kafka CRC 异常

一、背景 现场童鞋说客户的研发环境突然在近期间歇式的收到了CRC的相关异常,异常内容如下 Record batch for partition skywalking-traces-0 at offset 292107075 is invalid, cause: Record is corrupt (stored crc = 1016021496, compute crc = 1981017560) 报错完全没有…...

实时技术方案对比:SSE vs WebSocket vs Long Polling

早期网站仅展示静态内容,而如今我们更期望:实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢?三大经典技术各显神通: SSE(Server-Sent Events):轻量级单向数据流WebSocket:双向全双工通信Long Polling(长轮询):传统过渡方案假设目前有三…...

搭建游戏云服务器的配置要求包括哪些条件?

在游戏行业迅猛发展的背景下&#xff0c;越来越多的游戏团队、独立开发者、企业平台开始将服务器部署转向云端&#xff0c;尤其是在初期测试、公测阶段及全球发布期&#xff0c;云服务器所带来的弹性部署、全球覆盖、成本控制能力成为不可替代的优势。但问题随之而来&#xff1…...

Go语言八股文之Mysql锁详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

1T 服务器租用价格解析

服务器作为数据存储与处理的核心设备&#xff0c;对于企业和个人开发者而言至关重要。当涉及到租用 1T 服务器时&#xff0c;价格是大家很为关注的要点。然而&#xff0c;1T 服务器租用一个月的费用并非固定不变&#xff0c;而是受到诸多因素的综合影响。​ 影响 1T 服务器租用…...

面试题:详细分析Arraylist 与 LinkedList 的异同

相同点 都是List接口的实现类&#xff1a; ArrayList和LinkedList都实现了Java集合框架中的List接口&#xff0c;因此它们都提供了对列表元素的操作方法。 都继承了Collection接口&#xff1a; 由于List接口继承了Collection接口&#xff0c;所以ArrayList和LinkedList也都继承…...

6 任务路由与负载均衡

一、任务路由核心机制 1.1 静态路由配置 # celeryconfig.pytask_routes {# 精确匹配任务路径payment.process_order: {queue: priority_payment},# 通配符匹配任务类型report.*: {queue: low_priority_reports},# 正则表达式匹配re.compile(r^video\.(encode|compress)): {q…...

前端精度问题全解析:用“挖掘机”快速“填平精度坑”的完美解决方案

写在前面 “为什么我的计算在 React Native 中总是出现奇怪的精度问题?” —— 这可能是许多开发者在作前端程序猿的朋友们都会遇到的第一个头疼问题。本文将深入探讨前端精度问题的根源,我将以RN为例,并提供一系列实用解决方案,让你的应用告别计算误差。 一、精度问题的…...

探索嵌入式硬件的世界:技术、应用与未来趋势

目录 一、什么是嵌入式硬件&#xff1f; 二、嵌入式硬件的核心组件与架构 1. 微处理器与控制器 2. 存储器设备 3. 输入/输出接口 4. 电源管理模块 5. 时钟芯片与时序控制 三、嵌入式硬件的设计原则与技术难点 1. 低功耗与能耗优化 2. 小型化与高度集成 3. 高可靠性和…...

中级网络工程师知识点3

1.在网络线路施工中应遵循规范: ①缆线的布防应自然平直,不得产生扭绞、打圈接头等现象 ②线缆两端应贴有标签,标签自己清晰、正确,标签应选用不易损坏的材料 ③水平子系统中配线间到工作区信息插座电缆不超过90米 ④工作区子系统中信息插座到网卡不超过10米 ⑤信息插…...

Spring2:应用事务+连接池形成的工具类

工具类 package com.qcby.utils;import com.alibaba.druid.pool.DruidDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;/*** 事务的工具类*/ //事务是通过连接开启的&#xff0c;所以要保证是同一个连接 public class TxU…...

CentOS高手之路:从进阶实战到企业级优化

一、系统深度优化与性能调优 1. 内核参数调优 通过修改/etc/sysctl.conf文件调整内核参数&#xff0c;可显著提升服务器性能。例如&#xff1a; net.ipv4.tcp_fin_timeout30&#xff08;快速释放TCP连接&#xff09; vm.swappiness10&#xff08;减少交换分区使用&#xff0…...

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期&#xff0c;在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后&#xff0c;要想在Android.bp中通过自定义的一个变量或者条件实现选…...

命令拼接符

Linux多命令顺序执行符号需要记住5个 【&#xff5c;】【||】【 ;】 【&】 【&&】 &#xff0c;在命令执行里面&#xff0c;如果服务器疏忽大意没做限制&#xff0c;黑客通过高命令拼接符&#xff0c;可以输入很多非法的操作。 ailx10 网络安全优秀回答者 互联网…...

学习笔记(C++篇)--- Day 5

1.取地址运算符重载 1.1 const成员函数 ①将 const 修饰的成员函数称为const成员函数&#xff0c;const 修饰成员函数放到成员函数参数列表的后面。 ②const 实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。const 修饰 Date 类的…...

排序算法之基础排序:冒泡,选择,插入排序详解

排序算法之基础排序&#xff1a;冒泡、选择、插入排序详解 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析 二、选择排序&#xff08;Selection Sort&#xff09;2.1 算法原理2.2 代码实现&#xff…...

mysql集群

mysql双主keepalivedhaproxy 一、集群作用 实现高可用及负载均衡。 二、示例 1.实验环境 101 mysql01102 mysql01103 haproxy01keepalived01104 haproxy02keepalived02105 client2.各主机改名并关闭防火墙 101 mysql01102 mysql02103 haproxy01104 haproxy02105 clientsyst…...

【嵌入式开发-RGB 全彩 LED】

嵌入式开发-RGB 全彩 LED ■ RGB 全彩 LED简介■ 电路设计■ ■ RGB 全彩 LED简介 RGB 全彩 LED 模块显示不同的颜色。 ■ 电路设计 全彩 LED 使用 PA5、 蓝色&#xff08;B&#xff09; TIM2_CHN3 PA1、 绿色&#xff08;G&#xff09;TIM2_CHN2 PA2、 红色&#xff08;R&am…...

网络安全-等级保护(等保) 2-6 GB/T 36958—2018 《信息安全技术 网络安全等级保护安全管理中心技术要求》-2018-12-28 发布【现行】

################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》明确了安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、…...

几个正整数常用的位运算操作

位运算在高性能计算、资源敏感型场景&#xff08;如嵌入式系统&#xff09;、特定算法&#xff08;加密、压缩&#xff09;中具有不可替代的优势。合理使用位运算可以显著提升代码效率和资源利用率。 1. 判断一个正整数是否为8的倍数 bool is_multiple_of_eight(int n) {if (…...

消息队列(MQ)在项目中的使用场景详解【附开发实战思路】

在开发中&#xff0c;很多人一开始对消息队列&#xff08;MQ&#xff09;的认识仅限于“异步处理”&#xff0c;但随着项目复杂度提升&#xff0c;我们会发现 MQ 不仅能异步处理任务&#xff0c;还能解耦系统、削峰限流&#xff0c;甚至提高整体架构的稳定性和扩展性。 这篇文…...

基于MATLAB-GUI图形界面的数字图像处理

基于MATLAB GUI的数字图像处理系统实现方案&#xff0c;包含常见图像处理功能。代码分为两部分&#xff1a;GUI界面设计和回调函数实现。 %% 第一部分&#xff1a;创建GUI界面 (使用GUIDE) % 1. 打开GUIDE: guide % 2. 创建新GUI&#xff0c;添加以下控件&#xff1a; % - …...

C语言水仙花数

水仙花数&#xff08;Narcissistic Number&#xff09;也被称为自幂数&#xff0c;是数学中的一种特殊三位数&#xff0c;属于自幂数的一种类型。它的定义为&#xff1a;一个三位数&#xff0c;其各位数字的立方和等于该数本身。 具体定义与计算方式条件&#xff1a; 设一个三位…...

前k个高频元素

pair<int int>&#xff1a;用于存储两个数字。&#xff08;pair<int string>用于存储一个整数和一个字符串&#xff09; const pair<int int>&#xff1a;表示pair对象是常量&#xff0c;一旦初始化以后&#xff0c;其内部的两个成员值都不能被修改。 bool…...

人工智能与智能的底色都是哲学

人工智能与智能的底色都是哲学&#xff0c;因为哲学为它们提供了对“智能”本质的追问与思考。哲学自古以来便对人类智能、思维与意识进行深入探讨&#xff0c;为理解智能的结构和功能奠定了基础。同时&#xff0c;人工智能的发展也引发了诸多哲学问题&#xff0c;如伦理道德、…...

能碳管理系统:助力企业实现“双碳“目标

在全球气候治理和绿色低碳发展的大背景下&#xff0c;能碳管理系统正成为企业应对气候变化、实现"碳达峰、碳中和"战略目标的核心工具。这一系统通过数字化手段将能源管理与碳排放管控深度融合&#xff0c;为企业低碳转型提供全方位支持。 一、系统架构与核心技术 …...

开源鸿蒙北向源码开发: 5.0kit化相关sdk编译

5.0kit化可以在编译系统sdk时添加,将你的kit文件加入编译使得最终生成的sdk包含kits文件 修改编译脚本 修改build仓里面的构建脚本文件,添加kits目录脚本命令 社区的build脚本已经有kits编译功能了,只需要把你的kits目录新增的kit拷贝到社区仓interface仓了,和社区的都一起编…...

多通道电源管理芯片在分布式能源系统中的优化策略

摘要&#xff1a;随着分布式能源系统的广泛应用&#xff0c;对电源管理芯片的性能要求日益提升。本文深入探讨了多通道电源管理芯片在分布式能源系统中的优化策略&#xff0c;以国科安芯的ASP4644芯片为例&#xff0c;从电气特性、工作模式、热管理、可靠性设计以及系统集成为主…...

IEEE 列表会议第五届机器人、自动化与智能控制国际会议

会议地点&#xff1a;中国 成都 会议官网&#xff1a;ICRAIC 主办单位&#xff1a;成都理工大学 协办单位&#xff1a;成都大学 早鸟截稿&#xff1a;2025年7月15日 截稿时间&#xff1a;2025年8月20日 出版信息&#xff1a;IEEE出版&EI数据库 会议时间&#xff1a…...

GitHub 趋势日报 (2025年05月15日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 6685⭐ 15287Roff2xming521/WeClone&…...

Java 并发编程归纳总结(可重入锁 | JMM | synchronized 实现原理)

1、锁的可重入 一个不可重入的锁&#xff0c;抢占该锁的方法递归调用自己&#xff0c;或者两个持有该锁的方法之间发生调用&#xff0c;都会发生死锁。以之前实现的显式独占锁为例&#xff0c;在递归调用时会发生死锁&#xff1a; public class MyLock implements Lock {/* 仅…...

Git 笔记

设置Git的user name和email $ git config --global user.name "bread" $ git config --global user.email "1234567890qq.com"因为Git是分布式版本控制系统&#xff0c;所以需要填写用户名和邮箱作为一个标识。git config --global 参数&#xff0c;有了这…...

蒟蒻编程日志

ORZ &#xff08;用于记录你这个“人”是不是真的&#xff0c;也就是说CSDN的流量是否属合适&#xff09; 2025/4/14 21:25 开坑 前言 2024/10/26&#xff1a;CSP-J 260pts&#xff0c;CSP-S 45pts。 2025/3/1&#xff1a;%你赛 180pts rk34 寄&#xff01;这就是不认真的…...

深入GoFrame框架:GToken的优势、实践与踩坑经验分享

一、引言 近年来&#xff0c;Go语言凭借其简洁的语法、高并发性能和强大的标准库&#xff0c;在后端开发领域迅速崛起。从微服务到企业级应用&#xff0c;Go的生态圈正在蓬勃发展&#xff0c;吸引了越来越多的开发者投入其中。在这个生态中&#xff0c;框架的选择往往决定了项…...