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

server/2024/10/18 19:37:58/

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/server/42064.html

相关文章

哪些设计模式,你使用过哪些设计模式

Java框架中运用了多种设计模式&#xff0c;以下是一些具体的例子以及它们在框架中的应用&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。例如&#xff0c;Java中的Runtime类使用了单例模式…

WEB前端复习——JS

JS是运行在客户端的脚本&#xff08;script&#xff09;语言 引入JS进html ①sript标签内编写 <script type"text/javascript">document.write("<h1>hi</h1>")window.alert("who") </script> ②外部JS script src【…

Java设计模式——装饰者模式

Java设计模式——装饰者模式 1.简介 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许用户通过在一个对象上动态地添加职责或行为来增强其功能。这种类型的设计模式属于对象结构型模式&#xff0c;在不需要改变一个对象的内部结构…

那些年我与c++的叫板(一)--string类自实现

引子&#xff1a;我们学习了c中的string类&#xff0c;那我们能不能像以前数据结构一样自己实现string类呢&#xff1f;以下是cplusplus下的string类&#xff0c;我们参考参考&#xff01; 废话不多说&#xff0c;直接代码实现&#xff1a;&#xff08;注意函数之间的复用&…

leetcode刷题指南

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论&#xff0c;它可以运用到 Leetcode 上的刷题&#xff0c;也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然&#xff0c;本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…

ChatGPT-4o 实战 如何快速分析混淆加密和webpack打包的源码

ChatGPT-4o 几个特点 一个对话拥有长时间的记忆&#xff0c;可以连续上传文件&#xff0c;让其分析&#xff0c;最大一个代码文件只能3M&#xff0c;超出3M的文件&#xff0c;可以通过split-file可以进行拆分 其次ChatGPT-4o可以生成文件的下载链接&#xff0c;这有利于大文件的…

一文读懂云渲染与离线渲染的关系是什么

云渲染和离线渲染是什么关系呢&#xff1f;在渲染过程中经常会有人听到云渲染、离线渲染&#xff0c;然而两者的关系却有很多人都不清楚&#xff0c;下面一起来简单看看两者之间的关系吧。 1、渲染目的和过程&#xff1a; - 离线渲染&#xff1a;通常用于创建高质量的静态图像…

【嵌入式大赛应用赛道】机械手臂

电机 进步电机&#xff1a;它的转动是以确定的步数进行的&#xff0c;只要计算好脉冲数量和频率&#xff0c;就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机&#xff1a;将输入的电信号&#xff08;如电压或电流指令&#xff09;转换成轴上的精确旋转运动…