react hook:useMemo

useMemo在每次重新渲染的时候能够缓存计算的结果。
在初次渲染时,useMemo 返回调用 calculateValue 的结果。
在接下来的渲染中,如果依赖项没有发生改变,它将返回上次缓存的值;否则将再次调用 calculateValue,并返回最新结果。
尽管在某些情况下您可以不使用它,但对于需要进行昂贵的计算或处理大量数据的情况,使用 useMemo 是非常有益的。

calculateValue:要缓存计算值的函数。它应该是一个没有任何参数的纯函数,并且可以返回任意类型。在之后的渲染中,如果 dependencies 没有发生变化,React 将直接返回相同值。否则,将会再次调用 calculateValue 并返回最新结果,然后缓存该结果以便下次重复使用。
dependencies:所有在 calculateValue 函数中使用的响应式变量组成的数组。响应式变量包括 props、state 和所有你直接在组件中定义的变量和函数。

const cachedValue = useMemo(() => calculateValue, dependencies)

在严格模式下,为了 帮你发现意外的错误,React 将会 调用你的计算函数两次。
你可以仅仅依赖 useMemo 作为性能优化手段。否则,使用 state 变量 或者 ref 可能更加合适。

你应该仅仅把 useMemo 作为性能优化的手段。如果没有它,你的代码就不能正常工作,那么请先找到潜在的问题并修复它。然后再添加 useMemo 以提高性能。

默认情况下,当一个组件重新渲染时,React 会递归地重新渲染它的所有子组件。

记忆另一个 Hook 的依赖

依赖这样的对象会破坏记忆化。当组件重新渲染时,组件主体内的所有代码都会再次运行。创建 searchOptions 对象的代码行也将在每次重新渲染时运行。因为 searchOptions 是你的 useMemo 调用的依赖项,而且每次都不一样,React 知道依赖项是不同的,并且每次都重新计算 searchItems。

function Dropdown({ allItems, text }) {const searchOptions = { matchMode: 'whole-word', text };const visibleItems = useMemo(() => {return searchItems(allItems, searchOptions);}, [allItems, searchOptions]); // 🚩 提醒:依赖于在组件主体中创建的对象// ...

要解决此问题,你可以在将其作为依赖项传递之前记忆 searchOptions 对象 本身:

function Dropdown({ allItems, text }) {const searchOptions = useMemo(() => {return { matchMode: 'whole-word', text };}, [text]); // ✅ 只有当 text 改变时才会发生改变const visibleItems = useMemo(() => {return searchItems(allItems, searchOptions);}, [allItems, searchOptions]); // ✅ 只有当 allItems 或 serachOptions 改变时才会发生改变// ...

记忆一个函数

export default function Page({ productId, referrer }) {const handleSubmit = useMemo(() => {return (orderDetails) => {post('/product/' + productId + '/buy', {referrer,orderDetails});};}, [productId, referrer]);return <Form onSubmit={handleSubmit} />;
}
export default function Page({ productId, referrer }) {const handleSubmit = useCallback((orderDetails) => {post('/product/' + productId + '/buy', {referrer,orderDetails});}, [productId, referrer]);return <Form onSubmit={handleSubmit} />;
}

上面两个例子是完全等价的。useCallback 的唯一好处是它可以让你避免在内部编写额外的嵌套函数。

每次重新渲染时计算函数都会运行两次
在 严格模式 中,React 将调用你的某些函数两次而不是一次:

故障排查
我调用的 useMemo 应该返回一个对象,但返回了 undefined

这段代码不起作用:// 🔴 你不能像这样 `() => {` 在箭头函数中直接返回一个对象const searchOptions = useMemo(() => {matchMode: 'whole-word',text: text}, [text]);
请显式编写 return 语句:// ✅ 这有效并且是明确的const searchOptions = useMemo(() => {return {matchMode: 'whole-word',text: text};}, [text]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git本地新项目推送到远程仓库

假设开发了一个新项目&#xff0c;想推送到远程&#xff0c;具体的操作方式和命令如下&#xff1a; &#xff08;使用 git bash&#xff09; 1、切到项目目录中 2、初始化git仓库并在本地提交 //初始化git仓库 git init//将当前目录下的文件添加到仓库&#xff08;缓冲区&…

【知识分享】自动化测试首选接口自动化?

在分层测试的“金字塔”模型中&#xff0c;接口测试属于第二层服务集成测试范畴。 相比UI自动化测试而言&#xff0c;接口自动化测试收益更大&#xff0c;且容易实现&#xff0c;维护成本低&#xff0c;有着更高的投入产出比。因此&#xff0c;项目开展自动化测试的首选一般为接…

Python 基础语法:基本数据类型(字符串)

在日常生活中&#xff0c;我们经常会用文字来记录事物的名称、或记录事情的发展过程等&#xff0c;这些文字类型的数据&#xff0c;就叫做字符串。在未来的写代码的工作中&#xff0c;无论你从事的是哪个方面的编程&#xff0c;字符串操作必不可少&#xff0c;非常重要。 1 字…

linux系统安装docker

docker安装 docker安装自带源安装docker版本和官方源安装国内源安装新版docker生产docker的环境配置登入登出docker hub国内镜像源 docker安装 自带源安装 CentOS 7 中 Docker 的安装: Docker 软件包已经包括在默认的 CentOS-Extras 软件源(联网使用centos7u2自带网络Yum源)里…

计算机网络(基础篇)复习笔记——体系结构/协议基础(持续更新中......)

目录 1 计算机网络基础相关技术Rip 路由更新操作 2 体系结构(OSI 7层, TCP/IP4层)应用层运输层网络层IPv4无分类域间路由选择 CIDRIPV6 数据链路层循环冗余校验CRC协议设备 物理层传输媒体信道复用技术宽带接入技术数据通信 3 网络局域网(以太网Ethernet) 4 通信过程编码:信道极…

vue router 解决路由带参数跳转时出现404问题

我的页面是从一个vue页面router跳转到另一个vue页面&#xff0c;并且利用windows.open() 浏览器重新创建一个页签。但是不知道为什么有时候可以有时候又不行&#xff0c;经过反复测试与分析&#xff0c;最终发现是因为有一个参数的值里包含了小数点., 小数点是浏览器合法字符&a…

Pytest测试中的临时目录与文件管理!

在Pytest测试框架中&#xff0c;使用临时目录与文件是一种有效的测试管理方式&#xff0c;它能够确保测试的独立性和可重复性。在本文中&#xff0c;我们将深入探讨如何在Pytest中利用临时目录与文件进行测试&#xff0c;并通过案例演示实际应用。 为什么需要临时目录与文件&a…

#KEIL使用

关于在调试时&#xff0c;有些局部变量值无法在窗口中查看报错“not in scope"&#xff0c;是被优化掉了&#xff0c;降低优化等级即可。 参考博客&#xff1a; KeilMDK 开发过程中遇到一些奇怪问题记录_keil遇到了不正当的冲突-CSDN博客

Java高频面试之异常篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 finally 块中的代码什么时候被执行&#xff1f; &#xff08;1&#xff09;如果try{}语句块中有return语句&#xff0c;而finally{}语句块中没有return语句时&#xff0c;finally{}块中的代码在return语…

全国保护性耕作/常规耕作农田分类数据集

基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据集。分类代码&#xff1a;0值代表非农田&#xff0c;1值表示第一…

“轻松入门Electron:一步步构建梦想中的桌面软件

在数字化的浪潮中&#xff0c;桌面应用依旧占据着其独特而重要的位置&#xff0c;不论是在企业解决方案、专业工具软件还是个性化应用领域中都是如此。随着技术的演进&#xff0c;创建这些应用的过程已经变得更为简单和可行&#xff0c;尤其是随着Electron等框架的出现。Electr…

k8s中pod组件简介

背景 k8s中pod是很重要的概念&#xff0c;他是k8s调度的最小单位&#xff0c;和我们以往的以docker容器为调度单位是不一样的&#xff0c;那么为什么k8s会以pod为调度单位而不是以更小的docker容器为调度单位呢? pod组件 pod是一个逻辑的概念&#xff0c;其中可以包含多个d…

R语言及其开发环境简介

R语言及其开发环境简介 R 语言历史 R 语言来自 S 语言&#xff0c;是 S 语言的一个变种。S语言由贝尔实验室研究开发&#xff0c;著名的 C 语言、Unix 系统也是贝尔实验室开发的。R 属于 GNU 开源软件&#xff0c;最初发布于1997年&#xff0c;实现了与 S 语言基本相同的功能…

【异常处理】sbt构建Chisel库时出现extracting structure failed:build status:error的解决办法

文章目录 报错背景&#xff1a;解决思路&#xff1a;①IDEA中配置本地的SBT进行下载②更改下载源为华为的镜像站1. 修改sbtconfig.txt2. 增加repositories文件 ③查看报错信息 总结整理的Scala-Chisel-Chiseltest版本信息对应表 报错背景&#xff1a; 最近在写Chisel时&#x…

K8s-MySQL主从集群

K8s-MySQL主从集群 引言 该案例代码均可从https://github.com/WeiXiao-Hyy/k8s_example 获取&#xff0c;欢迎Star&#xff01; 需求 一个“主从复制”的MySQL集群有一个主节点Master有多个从节点Slave从节点需要能水平扩展所以写操作只能在主节点上执行读操作可以在所有节点…

Java组合模式在项目中使用场景

组合模式 一、介绍二、人员管理系统使用案例 一、介绍 将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用都是相同的。 组合模式主要由以下几个部分构成&#xff1a; Component&#xff08;组件&#xff09;&#xff1a;定义…

Navicat Premium:掌控数据库的强大工具

在当今数字化的时代&#xff0c;数据管理变得越来越重要。无论您是数据库管理员、开发人员还是普通用户&#xff0c;找到一个高效、易用的数据库管理工具是至关重要的。Navicat Premium for Mac/Win 就是这样一款强大的多协议数据库管理工具&#xff0c;它将为您的数据库管理体…

突破编程_C++_设计模式(组合模式)

1 组合模式的基本概念 C中的组合模式是一种对象结构型模式&#xff0c;它将多个对象组合成树形结构&#xff0c;以表示具有整体-部分关系的层次结构。在这个模式中&#xff0c;对单个对象&#xff08;叶子对象&#xff09;与组合对象&#xff08;容器对象&#xff09;的使用具…

HPE ProLiant MicroServer Gen8 RAID 1 扩容、故障恢复探索

声明&#xff1a;本探索只针对HP Microserver Gen8 Smart Array B120i板载阵列卡组建RAID 1&#xff08;不是RAID 10&#xff09;&#xff0c;不同阵列卡结果可能会不同&#xff0c;请谨慎操作&#xff0c;本人不对你操作后导致的任何数据丢失或者损失承担任何责任&#xff0c;…

kafka Interceptors and Listeners

Interceptors ProducerInterceptor https://www.cnblogs.com/huxi2b/p/7072447.html Producer拦截器(interceptor)是个相当新的功能&#xff0c;它和consumer端interceptor是在Kafka 0.10版本被引入的&#xff0c;主要用于实现clients端的定制化控制逻辑。 对于producer而言&…