React-hooks:useMemo

useMemo 是一个 React Hook,它在每次重新渲染的时候能够缓存计算的结果。

const cachedValue = useMemo(calculateValue, dependencies)
参数
  • calculateValue:要缓存计算值的函数。它应该是一个没有任何参数的纯函数,并且可以返回任意类型。React 将会在首次渲染时调用该函数;在之后的渲染中,如果 dependencies 没有发生变化,React 将直接返回相同值。否则,将会再次调用 calculateValue 并返回最新结果,然后缓存该结果以便下次重复使用。

  • dependencies:所有在 calculateValue 函数中使用的响应式变量组成的数组。响应式变量包括 props、state 和所有你直接在组件中定义的变量和函数。如果你在代码检查工具中 配置了 React,它将会确保每一个响应式数据都被正确地定义为依赖项。依赖项数组的长度必须是固定的并且必须写成 [dep1, dep2, dep3] 这种形式。React 使用 Object.is 将每个依赖项与其之前的值进行比较。

返回值

在初次渲染时,useMemo 返回不带参数调用 calculateValue 的结果。

在接下来的渲染中,如果依赖项没有发生改变,它将返回上次缓存的值;否则将再次调用 calculateValue,并返回最新结果。

一、看一个实例

1. 实例诉求

在这里插入图片描述
如上图:

  1. 父组件下有【count1】、【count2】两个变量;
  2. 页面上有两个按钮,每次点击按钮分别控制两个变量+1;
  3. 最下边的 斐波那契数列根据【count1】的值来计算得出;
2.代码
import { useState } from "react";// 斐波那契数列
function fib(n) {console.log('重新调用fib计算函数');if (n < 3) {return 1;}return fib(n - 2) + fib(n - 1);
}function App() {const [count1, setCount1] = useState(0);const [count2, setCount2] = useState(0);const result = fib(count1);console.log('重新渲染组件');return (<><div>父组件:<button onClick={() => setCount1(count1 + 1)}>change count1: {count1}</button><button onClick={() => setCount2(count2 + 1)}>change count2: {count2}</button></div>斐波那契数列第【{count1}】个值为: {result}</>)
}export default App;
3.效果

在这里插入图片描述
在这里插入图片描述

4. 发现问题

对照【3】中的两张截图,我们发现即使 fib函数并不依赖 count2 变量,当count2变量变更时,仍会触发 fib函数,这是非常不合理且不应该的,需要处理。

二、解决问题

1. 明确诉求

诉求:· fib函数只依赖 count1 变量,只有当count1变量变更时,才需触发 fib函数,而count2变量变更时,不需要触发 fib函数·

2. 代码实现
...// 2. 使用 useMemoconst result = useMemo(() => {return fib(count1);}, [count1])
...
3. 效果

在这里插入图片描述

三、完整代码

import { useMemo, useState } from "react";// 斐波那契数列
function fib(n) {console.log('重新调用fib计算函数');if (n < 3) {return 1;}return fib(n - 2) + fib(n - 1);
}function App() {const [count1, setCount1] = useState(0);const [count2, setCount2] = useState(0);// 1. 未使用 useMemo// const result = fib(count1);// 2. 使用 useMemoconst result = useMemo(() => {return fib(count1);}, [count1])console.log('重新渲染组件');return (<><div>父组件:<button onClick={() => setCount1(count1 + 1)}>change count1: {count1}</button><button onClick={() => setCount2(count2 + 1)}>change count2: {count2}</button></div>斐波那契数列第【{count1}】个值为: {result}</>)
}export default App;

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

社交巨头:探索Facebook的震撼力量

Facebook作为社交媒体领域的巨头&#xff0c;不仅在数字化社会中占据着重要地位&#xff0c;更是影响了人们的生活、工作和社交方式。本文将深入探索Facebook的震撼力量&#xff0c;从多个角度解读其在当今社会中的重要性和影响。 1. 全球用户覆盖的壮观规模 Facebook作为全球…

基于vs和C#的WPF应用之动画4---跳跳球

一、画布和图形 <Canvas x:Name"canvas4" Grid.Row"1" Grid.Column"1" Width"200" Height"200"><Canvas.Triggers><EventTrigger RoutedEvent"Loaded"><BeginStoryboard Storyboard"…

通过Mendix Portal管理应用整个生命周期

一、前言 大家常常会听到Mendix是一个统一的平台&#xff0c;怎么理解这个统一平台呢&#xff1f;它指的是帮助企业搭建一个统一的开发平台&#xff0c;管理应用的整个生命周期&#xff0c;之前大家更多地关注在应用开发层面&#xff0c;而开发只是整个生命周期的一环。 从上图…

#APPINVENTOR扩展插件之MQTT

1.APPINVENTOR网址&#xff1a; http://code.appinventor.mit.edu/http://code.appinventor.mit.edu/ 对应AI伴侣下载地址&#xff1a;http://code.appinventor.mit.edu/companions/MITAI2Companion.apkhttp://code.appinventor.mit.edu/companions/MITAI2Companion.apk 2.MQ…

C# WinForm —— 16 MonthCalendar 介绍

1. 简介 可以选择单个日期&#xff0c;也可以选择一段日期&#xff0c;在选择时间范围上 比较适用&#xff0c;但不能跨月份选择日期范围 在直观上&#xff0c;可以快速查看、选择日期/日期范围 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般…

Pyhton专题学习资料包,Python从入门到精通全套学习资料[30G]

资源概览 百本Python学习书籍大礼包百本前端学习书籍大礼包微专业-数据挖掘分析之Python篇小甲鱼零基础入门学习Python(全96集) 资源获取 &#x1f9d1;‍&#x1f4bb;【Pyhton专题资料】【30G】 百本Python书籍## 百本前端书籍 微专业-数据挖掘分析之Python篇 预备课【先…

高德地图,用AMapLoader组件,点击地图添加点并获取经纬度

效果如图所示 在这块我用的是高德地图,使用的是AMapLoader组件,这样就省去了很多配置步骤 代码如下 // 打开地图openMap() {this.mapBox true;this.$nextTick(() > {this.initMap();});},// 初始化高德地图initMap() {AMapLoader.load({key: "xxxxxxxxx", //key…

docker八大架构之应用服务集群架构

应用服务集群架构 在之前&#xff0c;一个应用层要负责所有的用户操作&#xff0c;但是有时用户增加后就会导致供不应求的现象&#xff08;单个应用不足以支持海量的并发请求&#xff0c;高并发的时候站点响应变慢&#xff09;&#xff0c;这时就需要增加应用层服务器&#xf…

【EI会议】2024年电网、电气与电子工程国际会议(PCEEE 2024)

2024 International Conference on Power Grid, Electrical and Electronic Engineering 【1】会议简介 2024年电网、电气与电子工程国际会议即将拉开帷幕&#xff0c;这是一场集结全球电网、电气与电子工程领域精英的学术盛会。 本次会议旨在深入探讨电网、电气与电子工程领域…

EasyExcel导出Excel文件——合并单元格多层级数据导出

合并单元格多层数据导出 思维脑图 代码实现 /*** 导出所有信息** param request 请求体*/ Override public void getWilliamExportList(WilliamReqVo request, HttpServletResponse response) throws Exception {List<SysDictData> dataByType dictDataService.getDic…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测

前言 OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper&#xff0c;应用最新的 OpenVINO™ 库开发&#xff0c;通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用&#xff0c;使用习惯与 OpenVINO™ C API 一致。OpenVINO™ C# API 由于是基于 OpenVINO™ 开发…

在实时超声病变检测中挖掘负面时间背景以抑制假阳性

文章目录 Mining Negative Temporal Contexts for False Positive Suppression in Real-Time Ultrasound Lesion Detection摘要挖掘负面时间背景以抑制假阳性&#xff1a;实时超声病变检测的新方法方法实验结果 Mining Negative Temporal Contexts for False Positive Suppress…

谷歌全球倾斜摄影OSGB数据转换正式版V1.0发布!

谷歌全球倾斜摄影OSGB数据转换正式版V1.0来了&#xff01; 五一放假前发布了V0.2版本&#xff0c;在这个版本中&#xff0c;生成了台北地区倾斜摄影OSGB数据&#xff0c;共有335GB&#xff0c;同时针对一些比较严重的问题进行了修复&#xff0c;包括修复瓦片缺失&#xff0c;数…

体重秤蓝牙语音芯片方案-WT2605蓝牙音频ic在电子秤上的应用

在快节奏的现代生活中&#xff0c;健康成为了每个人关注的焦点。而体重作为健康指标之一&#xff0c;更是备受关注。如今&#xff0c;一款全新的智能体重秤蓝牙语音芯片方案正悄然改变着我们的健康管理方式&#xff0c;让健康触手可及。 性能&#xff1a; 1&#xff1a;蓝牙语…

共享充电宝语音芯片ic方案支持远程4g无线更新语音

一、简介 共享充电宝语音芯片ic方案支持远程4g无线wifi蓝牙更新语音 共享充电宝已经是遍布在大街小巷的好产品&#xff0c;解决了携带充电宝麻烦的痛点 但是很多的共享充电宝在人机交互方便&#xff0c;还做得不够好&#xff0c;比如&#xff1a;借、还设备没有语音提示&…

每天认识新职业——网络工程师

一、网络工程师是什么 网络工程师是通过学习和训练&#xff0c;掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。相关职业&#xff1a;系统集成工程师、计算机硬件工程师职业其他名称&#xff1a;网络管理员、…

第二证券今日投资参考:VA、VE景气上行 猪价步入慢涨趋势

上周五&#xff0c;沪指午后在地产、金融等板块的带动下震荡上升&#xff0c;创业板指等弱势下探。到收盘&#xff0c;沪指微涨0.01%报3154.55点&#xff0c;深证成指跌0.58%报9731.24点&#xff0c;创业板指跌1.15%报1878.17点&#xff0c;科创50指数跌1.5%&#xff1b;两市算…

力扣HOT100 - 155. 最小栈

解题思路&#xff1a; 辅助栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> min_stack;public MinStack() {stack new Stack<>();min_stack new Stack<>();}public void push(int val) {stack.push(val);if (min_stack.i…

[Go] 结构体不初始化仍然能够调用其方法

文章目录 背景复现原理验证验证2结论参考文档 背景 在写代码的时候&#xff0c;偶然没有将结构体初始化&#xff0c;又调用了该结构体的方法&#xff0c;编译器竟然没有报错&#xff0c;而且运行也是正常的。 复现 写了一个小 demo 用于复现&#xff0c;可以看到&#xff0c…