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

React 中的 useMemo 和 useCallback

1. useMemo语法

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

1. 传入一个函数进去,会返回一个 memoized 值,需要注意的是,函数内必须有返回值;

2. 第二个参数会依赖值,当依赖值更新时,会从新计算;

2. useMemo优化示例

我们定义了一个total1函数,内部对一个数组进行求和,通过 reduce 计算总和,经过测试发现点击按钮后,只会执行 total1 ,不会执行 total2,假设total2计算量巨大,就会造成内存的浪费,通过 useMemo 可以帮我们缓存计算值。

import {useMemo, useState } from "react"function App() {const [count,setCount] = useState(0);//  正常的计算方法const total1 = ()=>{// 页面渲染时会重新输出console.log('total1......');const list = [1,3,5,7,9];// 数组求和return list.reduce((prev,current)=>prev+current,0)};// 加了缓存的计算const total2 = useMemo(()=>{// 页面重新渲不会再次输出console.log('total2......');const list = [1,3,5,7,9];// 数组求和return list.reduce((prev,current)=>prev+current,0)},[]);// 点击按钮测试输出const hindleClick = ()=>{setCount(count+1);};return (<div><p>Count:{count}</p><button onClick={hindleClick}>按钮</button><p>Total1:{total1()}</p><p>Total2:{total2}</p></div>)
}export default App

3. useCallback语法

useCallback(callback, deps)

1. useCallback 接收 2 个参数,第一个为缓存的函数,第二个为依赖值;

2. 主要用于缓存函数,第二次会返回同样的结果;

4. useCallback优化示例

定义一个子组件在父组件中调用,当父组件更新重新渲染时,子组件也会重新渲染。然后我们对子组件加了memo对传入的参数进行检测,同时对传入子组件的方法使用useCallback进行缓存,这样当父组件在更新时,缓存的方法没有发生变化,子组件通过memo发现传入的方法没有发生改变,也就不会重新渲染,以此提高了性能。

import {memo,useCallback,useState } from "react"
function App() {const [count,setCount] = useState(0);// 父组件点击更新const hindleClick = ()=>{setCount(count+1);};// 缓存点击方法const handleChildClick = useCallback(()=>{console.log("子节点点击了")},[]);return (<div><p>Count:{count}</p><button onClick={hindleClick}>按钮</button><Child onClick={handleChildClick}></Child></div>)
}// 检测传入的方法是否发生变化
const Child = memo(({onClick}:any)=>{console.log('child......')return <div>我是子节点<button onClick={onClick}></button></div>
})export default App

5. useMemo和useCallback的区别

他们都用于缓存,useCallback 主要用于缓存函数,返回一个缓存后的函数,而 useMemo 主要用于缓存值,返回一个缓存后的值。

相关文章:

React 中的 useMemo 和 useCallback

1. useMemo语法 const memoizedValue useMemo(() > computeExpensiveValue(a, b), deps); 1. 传入一个函数进去&#xff0c;会返回一个 memoized 值&#xff0c;需要注意的是&#xff0c;函数内必须有返回值&#xff1b; 2. 第二个参数会依赖值&#xff0c;当依赖值更新…...

idea社区版lombok总是突然失效:log未知的变量

用maven打包运行就没问题&#xff0c;就是idea的原因 有这么个参数 -Djps.track.ap.dependenciesfalse 是用来配置 IntelliJ IDEA 的 JVM 参数&#xff0c;它控制着 IntelliJ IDEA 是否跟踪处理器相关的依赖关系。具体来说&#xff0c;-Djps.track.ap.dependenciesfalse 参数的…...

Java语言程序设计基础篇_编程练习题*16.13(比较不同利率的贷款)

目录 题目&#xff1a;*16.13&#xff08;比较不同利率的贷款&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;*16.13&#xff08;比较不同利率的贷款&#xff09; 改写编程练习题5.21&#xff0c;创建一个图形用户界面&#xff0c;如图16-41b所示。程序应该允许…...

正点原子imx6ull-mini-Linux驱动之Regmap API 实验

我们在前面学习 I2C 和 SPI 驱动的时候&#xff0c;针对 I2C 和 SPI 设备寄存器的操作都是通过相关 的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码&#xff0c;但是这些本质 上都是对寄存器的操作&#xff0c;所以为了方便内核开发人员统一访问 I2C…...

postgresql 双重排序后 重复项 标识次序

postgresql 双重排序后 重复项 标识次序 在PostgreSQL中&#xff0c;如果你想要在双重排序后标识重复项的次序&#xff0c;可以使用窗口函数&#xff08;window functions&#xff09;。一个常见的方法是使用ROW_NUMBER()窗口函数&#xff0c;它会为每个分组内的行分配一个唯一…...

线程池ThreadPoolExecutor使用

文章目录 一、基础-Java中线程创建的方式1.1、继承Thread类创建线程1.2、实现Runnable接口创建线程1.3、实现Calable接口创建线程1.4、使用线程池创建线程二、概念-线程池基本概念2.1、并发和井行的主要区别2.1.1、处理任务不同2.1.2、存在不同2.1.3、CPU资源不同2.2、什么是线…...

Codeforces Round 963 (Div. 2)

A题&#xff1a;Question Marks 题目&#xff1a; Tim正在做一个由 4n 个问题组成的测试&#xff0c;每个问题都有 4 个选项&#xff1a;“A”、“B”、“C”和“D”。对于每个选项&#xff0c;有 n 个正确答案对应于该选项&#xff0c;这意味着有 n 个问题的答案为“A”。 n…...

Mysql函数学习笔记

MySQL 字符串函数 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码。 //返回 CustomerName 字段第一个字母的 ASCII 码 SELECT ASCII(CustomerName) AS NumCodeOfFirstChar FROM Customers;CHAR_LENGTH(s)-返回字符串 s 的字符数 //返回字符串 RUNOOB 的字符数 SELECT CHAR…...

【Linux基础】Linux基本指令(一)

目录 前言1&#xff0c; ls指令2&#xff0c;pwd指令三&#xff0c;cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径 四&#xff0c;创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五&#xff0c;删除目录或文件5.1 rmdir指令5.2 rm 指令 前言 从本章开始&#xff0…...

全球视野:航空蓄电池的国际标准与技术创新

航空蓄电池是一种专门为满足航空工业独特要求而设计的高性能储能设备。由于航空环境的特殊性&#xff0c;如高海拔、极端温度变化、频繁的充放电需求、以及对于设备重量和体积的严格限制&#xff0c;航空蓄电池需要具备一系列高级特性以确保飞机在各种飞行条件下能够安全有效地…...

11-初识python的函数——定义和调用

1 函数简介 function input()、print()、range()、len()都是python的内置函数&#xff0c;可以直接使用的 函数&#xff1a;可以用来保存代码&#xff0c;在需要的时候对这些语句进行重复调用 优点&#xff1a; 1. 遇到重复功能的时候&#xff0c;直接调用即可&#xff0c;…...

Windows安装Swoft框架

实现方式&#xff1a; 安装虚拟机&#xff0c;在虚拟机里用宝塔搭建环境后安装Swoft&#xff0c; 然后用Phpstorm SSH方式开发&#xff0c;用Apipost调用 websocket服务。 1、安装虚拟机&#xff0c;下载和安装参见 &#xff1a; https://blog.csdn.net/2401_84297265/article…...

阅读台灯什么品牌好?一文带你了解热门阅读台灯推荐

阅读台灯最终都绕不开护眼这个话题。护眼灯作为保护视力的辅助工具&#xff0c;以有效护眼的价值深受大众青睐。学生长时间用眼&#xff0c;普通台灯的伤害大&#xff0c;而阅读台灯的出现&#xff0c;通过其先进的技术和设计&#xff0c;能为学生提供了一个既舒适又健康的照明…...

1、.Net UI框架:Xamarin Forms - .Net宣传系列文章

Xamarin.Forms是一个跨平台移动应用开发框架&#xff0c;它允许开发者使用C#和.NET进行一次编码&#xff0c;然后在iOS、Android、macOS和Windows等多个平台上运行。Xamarin.Forms是Xamarin的一部分&#xff0c;而Xamarin是微软的.NET跨平台开发工具集&#xff0c;它提供了一套…...

Tomcat 最大连接数实现原理

spring boot 内置tomcat设置连接数 max-connections: 5 server:port: 9898servlet:context-path: /testtomcat:connection-timeout: 5000max-connections: 5accept-count: 5 ##初始化连接数量connectionLimitLatch protected LimitLatch initializeConnectionLatch() {if (ma…...

大数据应用【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 大数据在许多领域应用互联网领域应用生物医学…...

IP地址申请SSL证书实现https访问

为IP地址申请SSL证书以实现HTTPS访问&#xff0c;可以确保通过网络传输的数据得到加密保护。下面是为IP地址申请并安装SSL证书一般的步骤&#xff1a; 1 访问CA 打开JoySSL官网&#xff0c;注册一个账号用于申请证书&#xff0c;注册时会有选填项注册码&#xff0c;填写后可获…...

未授权访问漏洞上(漏洞复现合集)

目录 一&#xff1a;Redis未授权访问漏洞 * 步骤一:进入vulhub目录使用以下命令启动靶机... 步骤二:在Kali上安装redis程序进行服务的链接 步骤三:可以直接连接执行命令且不需要认证说明存在未授权访问漏洞...下载以下攻击项目... 步骤四:使用工具执行以下命令获取目标的命…...

多久没有清理你的电脑磁盘了?轻松解锁免费轻量磁盘清理工具

随着我们日常使用电脑的时间越来越长&#xff0c;磁盘上积累的无用文件和垃圾数据也越来越多。这些文件不仅占用宝贵的存储空间&#xff0c;还可能拖慢电脑的运行速度。 那么&#xff0c;你多久没有清理过你的电脑磁盘了呢&#xff1f; 今天&#xff0c;我将为大家推荐几款免…...

高精度加法c++

题目描述 计算ab的值&#xff0c;a,b皆为不超过240位的正整数。 输入 两个正整数&#xff0c;每行一个 输出 一个数&#xff0c;代表两个整数的和 样例输入 111111111111111111111111111111111111 222222222222222222222222222222222222 样例输出 3333333333333333333…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...