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

news/2025/2/21 4:24:26/

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/news/1461775.html

相关文章

学习Nginx(四):平滑升级与回滚

前言 Nginx的平滑升级是指在不停掉老进程的情况下&#xff0c;启动新进程&#xff0c;并逐步将请求切换到新进程上&#xff0c;从而实现无缝升级。 在进行Nginx平滑升级之前&#xff0c;仔细阅读Nginx的官方文档和升级指南&#xff0c;根据实际情况进行操作。建议在测试环境中…

Google I/O 2024:探索未来AI技术的无限可能

近日&#xff0c;Google I/O 2024大会圆满落幕&#xff0c;带给我们一场关于人工智能的盛宴。在这场大会上&#xff0c;Google推出了一系列令人激动的AI新功能和工具&#xff0c;让我们得以一窥未来的科技发展。今天&#xff0c;就让我来为大家总结一下这些亮点吧&#xff01; …

SS8837T智能门锁驱动马达-门锁电机驱动解决方案

智能门锁是现代家庭安全的重要组成部分&#xff0c;一般由锁体、电路板、马达、显示屏、锁芯、传感控制器等组成&#xff1b;而电机驱动芯片负责驱动锁舌的伸缩&#xff0c;通过精确控制电机的旋转方向和速度&#xff0c;能够确保锁舌的快速、平稳伸出和缩回&#xff0c;从而提…

ctfshow web入门 php反序列化 web267--web270

web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…

Python 自动化脚本系列:第5集

41. 使用 cryptography 库自动化文件加密 Python 的 cryptography 库提供了一种使用对称加密算法加密和解密文件的安全方式。你可以自动化加密和解密文件的过程&#xff0c;以保护敏感数据。 示例&#xff1a;使用 Fernet 加密和解密文件 假设你想使用 Fernet 对称加密算法加…

CUDA backend requires cuDNN. Please resolve dependency or disable的解决方法

先把 C:\Program Files\NVIDIA\CUDNN\v9.0里面的bin,include,lib文件夹中最里面的文件 复制到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4中的bin,include,lib文件夹 你的路径或许有点不一样&#xff0c;但大概就是这样 注意&#xff0c;复制完后&#xff0c;文…

关于react的注意事项和问题

在使用React时&#xff0c;有一些重要的注意事项和问题需要考虑。以下是一些主要的方面&#xff1a; 注意事项 组件结构和组织&#xff1a; 保持组件简单和可复用&#xff1a;将组件拆分为较小和独立的部分&#xff0c;以提高代码的可维护性和可测试性。遵循单一职责原则&…

【iOS开发】—— 初识锁

【iOS开发】—— 初识锁 线程安全锁的种类自旋锁定义原理自旋锁缺点OSSpinLock&#xff08;自旋锁&#xff09; 互斥锁os_unfair_lockpthread_mutexNSLockNSRecusiveLockSemaphore信号量synchronized 总结两种之间的区别和联系&#xff1a; 线程安全 当一个线程访问数据的时候…