当前位置: 首页 > 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和商务人员就复杂…...

NPU vs GPU:为什么你的AI项目需要专用神经网络处理器?

NPU vs GPU&#xff1a;为什么你的AI项目需要专用神经网络处理器&#xff1f; 当你在深夜调试一个实时人脸识别模型时&#xff0c;GPU风扇的轰鸣声是否让你担心电费账单&#xff1f;当部署在边缘设备的图像分类服务因为响应延迟被客户投诉时&#xff0c;是否考虑过硬件选型可能…...

为什么你的Tinymce总是显示秘钥提示?深入解析富文本编辑器的授权机制

解密Tinymce授权机制&#xff1a;从技术原理到合规实践 每次启动项目时&#xff0c;那个突兀的"未授权"提示框是否让你感到困扰&#xff1f;作为前端开发领域的标配工具&#xff0c;Tinymce的授权机制远比表面看到的复杂。让我们拨开迷雾&#xff0c;从技术实现到商业…...

从单体到微服务:用Ruoyi-Vue-Plus框架快速搭建多租户后台系统(含AI模块开发避坑指南)

从单体到微服务&#xff1a;Ruoyi-Vue-Plus框架的多租户实战与AI模块开发精要 当企业级应用需要同时服务多个客户群体时&#xff0c;如何确保数据隔离与系统性能的平衡成为架构设计的核心挑战。Ruoyi-Vue-Plus作为一款基于Spring Boot的快速开发框架&#xff0c;其多租户实现机…...

LFM2.5-1.2B-Thinking-GGUF基础教程:单页Web界面交互逻辑与后处理机制

LFM2.5-1.2B-Thinking-GGUF基础教程&#xff1a;单页Web界面交互逻辑与后处理机制 1. 模型与平台介绍 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。这个镜像采用内置GGUF模型文件和llama.cpp运行时&#xff0c;提供了…...

储能系统中的双向DCDC变流器:模型预测控制下的高效稳定运行策略

储能双向DCDC变流器-模型预测控制 储能buck-boost双向dcdc负载 [1]初级控制为下垂控制 [2]电压环才采用PI控制 [3]电流环采用模型预测 ①蓄电池控制外环使用U-I下垂控制PI控制器产生电流环给定值 ②设计了电流内环的模型预测控制器&#xff0c;模型预测控制由于是主动的预测&am…...

保姆级教程:在Windows 11上用VSCode和Conda搞定Depth-Anything-3(含常见报错修复)

Windows 11深度估计实战&#xff1a;VSCodeConda环境下的Depth-Anything-3全流程指南 深度估计作为计算机视觉领域的重要技术&#xff0c;正在自动驾驶、增强现实等场景中发挥关键作用。本文将带你在Windows 11系统上&#xff0c;使用VSCode和Conda搭建Depth-Anything-3开发环境…...

深度学习项目训练环境多场景落地:中小企业AI研发团队低成本GPU训练环境方案

深度学习项目训练环境多场景落地&#xff1a;中小企业AI研发团队低成本GPU训练环境方案 1. 环境准备与快速上手 对于中小企业的AI研发团队来说&#xff0c;搭建一个稳定可靠的深度学习训练环境往往是个头疼的问题。硬件成本高、环境配置复杂、依赖库冲突等问题经常让团队望而…...

Pixel Fashion Atelier基础教程:硬核8-Bit界面操作逻辑与非对称布局解析

Pixel Fashion Atelier基础教程&#xff1a;硬核8-Bit界面操作逻辑与非对称布局解析 1. 像素时装锻造坊简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工具&#xff0c;它彻底改变了传统AI工具的界面设计理念。这款工具将复古日系RPG的"…...

轻量级二维码工具性能优化:从加载到部署的全流程实践

轻量级二维码工具性能优化&#xff1a;从加载到部署的全流程实践 【免费下载链接】qrcodejs Cross-browser QRCode generator for javascript 项目地址: https://gitcode.com/gh_mirrors/qr/qrcodejs 二维码生成功能已成为现代Web应用的常见需求&#xff0c;但传统实现方…...

35:L构建数据泄露检测:蓝队的数据保护

作者&#xff1a; HOS(安全风信子) 日期&#xff1a; 2026-03-11 主要来源平台&#xff1a; GitHub 摘要&#xff1a; 当基拉开始针对数据进行攻击时&#xff0c;数据泄露成为蓝队防御的关键挑战。L构建了数据泄露检测系统&#xff0c;通过AI算法分析数据流动、访问模式和异常行…...