React 之 记忆化函数cache(十四)

embedded/2024/10/18 16:48:46/

const result = cache(fn)方法:

fn:要对其结果进行缓存的函数。fn 可以接受任何参数并返回任何值。
返回值result : 返回一个与 fn 具有相同类型签名的已缓存版本。在此过程中,它不会调用 fn。

cache 用法

import {cache} from 'react';
import calculateMetrics from 'lib/metrics';const getMetrics = cache(calculateMetrics);//当首次使用 data 调用 getMetrics 时,getMetrics 将调用 calculateMetrics(data) 并将结果存储在缓存中
//如果再次使用相同的 data 调用 getMetrics,它将返回缓存的结果,而不会再次调用 calculateMetrics(data)
function Chart({data}) {const report = getMetrics(data);// ...
}

1.缓存代价昂贵的计算

使用 cache 跳过重复工作

import {cache} from 'react';
import calculateUserMetrics from 'lib/user';const getUserMetrics = cache(calculateUserMetrics);function Profile({user}) {const metrics = getUserMetrics(user);// ...
}function TeamReport({users}) {for (let user in users) {//如果user相同,使用上一次calculateUserMetrics方法计算的缓存,反之调用calculateUserMetrics计算const metrics = getUserMetrics(user);// ...}// ...
}

2.不同组件共享数据,预加载数据

要在组件之间共享数据快照,通过缓存长时间运行的数据获取,你可以在渲染组件之前开始异步工作。

//当多个组件进行相同的数据获取时(即多个组件都调用getUser函数),只会发出一个请求,并且返回的数据会被缓存并在各个组件之间共享
//尽管传递的是相同参数,我的记忆化函数仍在重新运行 
//只要入参id不相同,就不会缓存数据,会调用获取新数据。
const getUser = cache(async (id) => {return await db.user.query(id);
}async function Profile({id}) {const user = await getUser(id);return (<section><img src={user.profilePic} /><h2>{user.name}</h2></section>);
}function Page({id}) {// ✅ 正确示例:开始获取用户数据。getUser(id);// ……一些计算工作return (<><Profile id={id} /></>);
}

http://www.ppmy.cn/embedded/42027.html

相关文章

前端 JS 经典:数组去重万能方法

前言&#xff1a;只需要掌握这一个方法&#xff0c;就可以对有任何重复的数据数组&#xff0c;进行去重了。 可以自己思考下&#xff0c;怎么对以下对象数组去重&#xff1a; const arr [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: { a: 1, b: 2 } },{ b: 2, a: 1, c:…

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件&#xff1a;弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下&#xff08;示例&#xff09;&#xff1…

CSS引入方式

CSS引入方式 1 行内式2 内嵌式3 连接式/外部样式表 1 行内式 行内式,通过元素开始标签的style属性引入 样式语法为&#xff1a; 样式名:样式值; 样式名:样式值; 代码 <input type"button" value"按钮"style"display: block;width: 60px; height: 4…

51. UE5 RPG 自定义FGameplayEffectContext

我们期望能够通过FGameplayEffectContext将此次技能造成的伤害是否触发格挡和暴击的参数传递到AttributeSet中&#xff0c;所以需要实现自定义一个FGameplayEffectContext类&#xff0c;来增加对应的配置。 创建自定义类文件 首先在Public目录上右键&#xff0c;选择添加一个…

基于springboot+vue+Mysql的交流互动系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

小红书“脆皮”用户健康研究报告

人均脆皮、血脉觉醒、爆肝打工、脱发危机……各式各样的健康议题不断被推上生活舞台&#xff0c;年轻人纷纷自嘲&#xff1a;“20多岁的年纪&#xff0c;却有了60多岁的身体”。 近年&#xff0c;大健康行业欣欣向荣&#xff0c;小红书成为大众分享健康生活的聚集地&#xff0c…

广西壮族自治区工程系列生态环境行业技术资格评审条件

广西壮族自治区工程系列生态环境行业技术资格评审条件评审文件链接广西壮族自治区人力资源和社会保障厅网站评审工作的通知关于开展2023年度工程系列生态环境行业职称评审工作的通知 - 职称评审 - 广西壮族自治区生态环境厅网站类别基本条件业绩成果论文、著作条件工程师一、获…

Oracle中全量CHECKPOINT和增量CHECKPOINT的区别与作用

全量CHECKPOINT和增量CHECKPOINT对用户都是透明的&#xff0c;而增量CHECKPOINT只不过是将全量CHECKPOINT要写的脏块分时间分批次写到数据文件中而已&#xff0c;此操作可以极大地减少对数据库性能的影响。 全量CHECKPOINT 全量CHECKPOINT是指DBWR进程将脏缓冲区列表中的脏块一…