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

浅谈useMemo函数

什么是 useMemo?

useMemo 是 React 中的一个 Hook,它可以用来缓存计算结果,并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数:一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时,useMemo 会重新执行传入的函数,并返回新的计算结果。

为什么需要 useMemo?

在 React 应用中,渲染组件是一个非常消耗资源的操作。如果在每次渲染时都进行一些昂贵的计算,就会导致应用的性能下降。为了避免这种情况,我们可以使用 useMemo 来缓存计算结果。这样,在后续的渲染中,只要依赖数组不发生变化,就可以直接使用缓存的计算结果,从而提高了组件的渲染性能。

语法

使用 useMemo 非常简单。首先,我们需要编写一个计算函数,然后将其作为第一个参数传递给 useMemo。例如:

import React, { useMemo } from 'react';function MyComponent() {const result = useMemo(() => {// 计算过程return value;}, [dep1, dep2]);// 渲染组件return (<div>{result}</div>);
}

在上面的代码中,我们编写了一个计算函数,并将其作为第一个参数传递给 useMemo。useMemo 还接收一个依赖数组作为第二个参数,其中包含了需要监视变化的变量。

当 dep1 或 dep2 发生变化时,useMemo 会重新执行计算函数,返回新的计算结果。如果 dep1 和 dep2 没有发生变化,则直接使用缓存的计算结果。

如何使用 useMemo?

使用前:

import React, { useMemo, useState } from "react";export const EgOfUseMemo: React.FC = () => {const [userInfo , setUserInfo] = useState({name: 'nobody',gender: 'male'})const formatGender = (gender) => {console.log('调用了翻译性别的方法')return gender === 'male' ? '男' : '女'}const handleClick = () => {setUserInfo({...userInfo,name: 'lvxiaobu'})}// 优化前,不使用useMemo的情况下,修改其他属性,也会重新调用formatGender方法,浪费计算资源// 每次点击按钮,都会调用一次formatGender方法const gender = formatGender(userInfo.gender)return (<div>姓名: {userInfo.name} -- 性别:  { gender } <br/><button onClick={handleClick}> 点击修改名字</button></div>)
}

不使用useMemo的情况下,修改其他属性,也会重新调用formatGender方法,浪费计算资源
使用后:

import React, { useMemo, useState } from "react";export const EgOfUseMemo: React.FC = () => {const [userInfo , setUserInfo] = useState({name: 'nobody',gender: 'male'})const formatGender = (gender) => {console.log('调用了翻译性别的方法')return gender === 'male' ? '男' : '女'}const handleClick = () => {setUserInfo({...userInfo,name: 'lvxiaobu'})}// 优化后,修改其他属性,不会重新调用formatGender方法,性能提升// // 每次点击按钮,都不会调用formatGender方法const gender = useMemo(() => {return formatGender(userInfo.gender)}, [userInfo.gender])return (<div>姓名: {userInfo.name} -- 性别:  { gender } <br/><button onClick={handleClick}> 点击修改名字</button></div>)
}

总结

本文我们浅谈了 useMemo 函数,了解到它可以帮助我们缓存计算结果,提高了组件的渲染性能。要使用 useMemo,我们需要提供一个计算函数,并指定需要监视变化的依赖数组。这样,只要依赖数组不发生变化,就可以直接使用缓存的计算结果,从而避免了重复进行昂贵的计算操作。

useMemo和useCallback的区别及使用场景

  • useMemo 缓存的结果是回调函数中return回来的值,主要用于缓存计算结果的值,应用场景如需要计算的状态
  • useCallback 缓存的结果是函数,主要用于缓存函数,应用场景如需要缓存的函数,因为函数式组件每次任何一个state发生变化,会触发整个组件更新,一些函数是没有必要更新的,此时就应该缓存起来,提高性能,减少对资源的浪费;另外还需要注意的是,useCallback应该和React.memo配套使用,缺了一个都可能导致性能不升反而下降。

相关文章:

浅谈useMemo函数

什么是 useMemo&#xff1f; useMemo 是 React 中的一个 Hook&#xff0c;它可以用来缓存计算结果&#xff0c;并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数&#xff1a;一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时&#xff0c;useMemo 会重…...

【Python】Python系列教程-- Python3 推导式(十九)

文章目录 前言列表推导式字典推导式集合推导式元组推导式&#xff08;生成器表达式&#xff09; 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–Python3 VSc…...

docker对cpu资源做限制

系列文章目录 文章目录 系列文章目录一、cgroup1.groups四大功能2.CPU 资源控制 二、1.限制可用的 swap 大小&#xff0c; --memory-swap2.对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 总结 一、cgroup 1.groups四大功能 资源限制&#xff1a;可以对任务使用的资源…...

国际化语言项目

基本概念 1、使用QString对象表示所有用户可见的文本。由于QString内部使用Unicode编码实现&#xff0c;所以它可以用 于表示所有需要向用户呈现的文本。当然&#xff0c;对于仅程序员可见的文本并不需要都变为QString对象&#xff0c;可利 用Qt提供的QCString或原始的“char …...

交直流系统潮流计算及相互关联特性分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

如何快速掌握Facebook运营+独立站运营基础?

在当今数字化时代&#xff0c;Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道&#xff0c;你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识&#xff0c;为你的业务…...

Java之旅(十三)

Java 类 Java类是Java编程语言中的基本构建块&#xff0c;是一种用户定义的数据类型&#xff0c;它可以被看作是一个模板或蓝图。它是对象的模板&#xff0c;&#xff0c;描述了一组具有相同特征&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;的对象。Java …...

Calibre 6.18.1 正式发布,功能强大的开源电子书工具

导读Calibre 开源项目是 Calibre 官方出的电子书管理工具。它可以查看&#xff0c;转换&#xff0c;编辑和分类所有主流格式的电子书。Calibre 是个跨平台软件&#xff0c;可以在 Linux、Windows 和 macOS 上运行。 Calibre 6.18.1 正式发布&#xff0c;此次更新内容如下&#…...

如何在C语言中定义和使用函数?

如何在C语言中定义和使用函数&#xff1f; 引言&#xff1a; 函数是C语言中的一个重要概念&#xff0c;它使程序能够模块化、重用和组织代码。通过将一段逻辑相关的代码封装到函数中&#xff0c;我们可以提高代码的可读性、可维护性和重用性。本文将详细介绍在C语言中定义和使…...

【C++】4.多媒体库:SFML库入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…...

【算法题】1717. 删除子字符串的最大得分

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面…...

Codeforces Round 877 (Div. 2) ABCD

A. Blackboard List solve: 1、生成的数一定不是负数&#xff0c;所以有负数的情况下&#xff0c;负数一定是原来的数。 2、没有负数的情况下&#xff0c;最大的数一定是原来的数&#xff0c;因为操作只能使数变小。 void solve() {cin>>n;for(int i0;i<n;i)cin>&…...

easyExcel导入失败提示用户第几行有误并回滚数据

思路&#xff1a; 在controller定义一个map&#xff0c;将map传入excel监听器&#xff0c;在监听器中处理excel的数据&#xff0c;读取到某一行出现错误就将错误提示信息存入map并抛出一个异常给service。在service方法上开启事务&#xff0c;并将异常出实现数据回滚&#xff0…...

问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕

随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地&#xff0c;区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代&#xff0c;区块链已不仅仅是一项技术、一种工具&#xff0c;更是一种思维…...

解读 Nginx 配置

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 1、Nginx 配…...

知识变现海哥:课程定价容易出现的三大误区

哈喽&#xff0c;大家好&#xff0c;我是海哥&#xff0c;知识付费变现创业教练&#xff0c;教育公司培训总监&#xff0c;从事知识付费变现咨询10年&#xff0c;已助力3000人实现知识付费变现。 很多做知识付费的老师都有定价方面的困惑。怕定太高&#xff0c;卖不出去&#…...

Android开发 LogDog (日志狗)V2.0.0

目录 一、简介 二、使用推荐 1、初始化LogDog 2、运行中如何更改初始化时的配置&#xff1f; 三、更改 四、新功能 1、Log过滤 2、自定义打印 3、提供占位符式打印 一、简介 LogDog V1.0 版本https://blog.csdn.net/Ym_quiet/article/details/130453232?spm1001.2014…...

JavaScript break

在JavaScript中&#xff0c;break语句用于提前退出或终止循环或switch语句。它允许您立即停止循环或switch的执行&#xff0c;并继续执行后面的代码。 以下是在循环中使用break的示例&#xff1a; javascript for (var i 0; i < 10; i) { if (i 5) { break; // 当…...

linux服务器使用curl命令处理常用es查询

目录 场景&#xff1a; 结果格式化显示&#xff1a; 验证服务启动&#xff1a; 单个参数变量查询&#xff1a; 分页查询&#xff1a; 日期范围查询: must中单个参数条件查询 must中多个参数条件查询 使用filter过滤查询 使用sort过滤查询 总结&#xff1a; 场景&#xf…...

Office Visio 2013安装

哈喽&#xff0c;大家好。今天一起学习的是Visio 2013的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...