- ReactJS 菜鸟教程
- ReactJS 教程
- ReactJS - 简介
- ReactJS - 安装
- ReactJS - 特性
- ReactJS - 优点和缺点
- ReactJS - 架构
- ReactJS - 创建 React 应用程序
- ReactJS - JSX
- ReactJS - 组件
- ReactJS - 嵌套组件
- ReactJS - 使用组件
- ReactJS - 组件集合
- ReactJS - 样式
- ReactJS - 属性(props)
- ReactJS - 使用属性创建组件
- ReactJS - props 验证
- ReactJS - 构造函数
- ReactJS - 组件生命周期
- ReactJS - 事件管理
- ReactJS - 创建事件感知组件
- ReactJS - 在Expense Manager APP中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React 钩子的组件生命周期
- ReactJS - 组件的布局
- ReactJS - 分页
- ReactJS - Material 用户界面
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 不受控制的组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键
- ReactJS - 路由
- ReactJS - 冗余
- ReactJS - 动画
- ReactJS - 引导程序
- ReactJS - 地图
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- ReactJS - 钩子简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义钩子
- ReactJS - 可访问性
- ReactJS - 代码拆分
- ReactJS - 上下文
- ReactJS - 错误边界
- ReactJS - 转发引用
- ReactJS - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 优化性能
- ReactJS - 分析器 API
- ReactJS - 门户
- ReactJS - 没有 ES6 ECMAScript 的 React
- ReactJS - 没有 JSX 的 React
- ReactJS - 协调
- ReactJS - 引用和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - 严格模式
- ReactJS - Web 组件
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - 属性类型
- ReactJS - 浏览器路由器
- ReactJS - DOM
- ReactJS - 旋转木马
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
ReactJS - cache()
在 React 18 中,有一个新功能叫做“缓存函数:cache() ”。此函数会记住当特定输入传递给它时发生的情况。因此,如果我们在 React 中处理某些内容时使用具有相同参数的相同函数,它将不会重复这项工作。相反,它将快速返回记住的结果,从而节省用户的时间和资源。它类似于我们的计算机记住东西,以便更有效地执行。
语法
const cachedFunc = cache(func);
参数
- func - func 是一个函数,可以使用一些信息执行任务,它可以处理我们提供给它的任何类型的信息。
返回值
当我们将函数的这个缓存版本与特定输入一起使用时,它会检查它是否已经存储了这些输入的结果。如果是这样,它会给我们提供该结果,而无需再次运行该函数。但是,如果它没有存储的结果,它会使用这些输入运行原始函数,将结果保存在其内存中,然后给我们该结果。因此,仅当缓存中没有保存结果时,原始函数才会运行。
例子
这是一个我们如何在 React 18 中使用缓存函数:cache() 的例子。在此示例中,我们将创建一个简单的缓存来计算数字的平方。
import { cache } from 'react';
// Calculate the square of a number and cache the result
export const square = cache(async (num) => {
console.log(`Calculating the square of ${num}`);
return num * num;
});
const result1 = await square(5); // Calculate and cache the result
const result2 = await square(5); // Return the memoized (cached) result
console.log(result1); // Calculating the square of 5, 25
console.log(result2); // 25 (No recalculation, just returns the cached result)
// Use the square function
const result3 = await square(3); // This will calculate and cache the result.
console.log(result3); // Output: Square of 3, 9
在此示例中,我们创建了一个平方函数,用于计算和缓存数字的平方。当我们在同一渲染过程中使用相同的输入(例如,5)调用它时,它会返回缓存的结果,从而减少了重新计算的需要。当我们使用不同的输入(例如,3)再次调用它时,它会计算并缓存一个新结果。
示例 - 为避免重复工作,请使用缓存这是另一个示例,展示了 React 中缓存函数:cache() 的使用 -
缓存函数:cache() 用于保存名为 calculateProductStats 的函数的结果。缓存创建的 getProductStats 方法用于收集各种项目的统计信息。
ProductDetails 组件使用 GetProductStats 检索单个产品的数据,而 SalesDetails 组件使用它来获取报表中多个项目的数据。这显示了我们如何根据我们的需求将记忆应用于各种方法和组件。
import { cache } from 'react';
import calculateProductStats from 'lib/product';
const getProductStats = cache(calculateProductStats);
function ProductDetails({product}) {
const stats = getProductStats(product);
// write code here
}
function SalesDetails({products}) {
for (let product in products) {
const stats = getProductStats(product);
// write code here
}
// write code here
}
如果 ProductDetails 和 SalesReport 中都显示相同的产品对象,则这两个组件可以共享工作,并且只能为该产品调用一次 calculateProductStats。
假设 ProductDetails 是第一个呈现的。它将调用 getProductStats 并查看是否存在缓存结果。将会出现缓存未命中,因为这是第一次使用该产品调用 getProductStats。然后,getProductStats 将使用该产品调用 calculateProductStats 并将结果保存到缓存中。
当 SalesReport 生成其产品列表并访问同一产品对象时,它将调用 getProductStats 并从缓存中读取结果。
示例 - 预加载数据
假设我们正在创建一个网页,并且需要从数据库中获取一些数据以在其上显示。此数据提取可能需要一些时间。我们甚至可以在需要数据之前使用新的缓存函数:cache() 在后台开始获取数据。
下面是一个例子 -
假设我们有一个 getUser 函数,它从数据库中收集用户的数据。甚至在我们需要用户数据之前,我们就开始通过执行 getUser(id) 在 Page 组件中获取它。在进行数据检索时,我们可以在组件中执行其他操作。
然后,通过在 Profile 组件中再次调用 getUser 来获取用户的信息。如果 Page 组件的初始调用已经获取并缓存了用户的数据,则 Profile 组件可以使用该缓存的数据,而不是执行另一个缓慢的数据库访问。这样可以加快您的页面速度,因为它最大限度地减少了获取数据的等待时间。
import { cache } from 'react';
import fetchProductDetails from 'api/products';
const getProductDetails = cache(async (productId) => {
return await fetchProductDetails(productId);
});
function ProductInfo({ productId }) {
// Fetch product details
getProductDetails(productId);
return (
<div>
<h2>Product Information</h2>
{getProductDetails(productId).description}
</div>
);
}
在此示例中,我们有一个 ProductInfo 组件,该组件通过缓存函数:cache() 在后台开始接收产品详细信息。这样,当我们需要数据时,它已经在缓存中,从而减少了在页面上显示产品信息所需的时间。
局限性
- 在 React 中处理服务器请求时,每次发出新的服务器请求时,都会清理所有记忆函数的缓存结果的内存存储(缓存)。
- 每次我们使用缓存函数:cache() 时,都会创建一个新的、不同的函数。因此,如果我们使用相同的原始函数多次调用缓存,我们将收到单独的记忆化函数,并且这些记忆化函数不会共享相同的内存存储来保存结果。
- 缓存提供的记忆函数也会记住错误。如果原始函数对任何输入返回错误,则该错误将保留在内存中。因此,在不重新运行该函数的情况下,使用具有相同输入的 resignized 函数将导致相同的错误。
- 重要的是,缓存方法只打算在 React 中称为“服务器组件”的部分中使用。它不打算用于我们应用程序的其他部分。
总结
“缓存函数:cache() ”是 React 18 中添加的一项新功能,它允许开发人员根据声明的输入轻松存储和检索函数的结果。这样可以节省重复计算,并在遇到相同的输入时快速返回缓存结果,从而提高效率。