ReactJS 教程

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 事件 ReactJS 状态管理 ReactJS 状态管理 API ReactJS 无状态组件 ReactJS Hooks 进行状态管理 ReactJS Hooks 的组件生命周期 ReactJS 布局组件 ReactJS 分页 ReactJS Material UI ReactJS Http 客户端编程 ReactJS 表单编程 ReactJS 受控组件 ReactJS 非受控组件 ReactJS Formik ReactJS 条件渲染 ReactJS 列表 ReactJS Key 键 ReactJS 路由 ReactJS Redux ReactJS 动画 ReactJS Bootstrap ReactJS Map ReactJS 表格 ReactJS 使用 Flux 管理状态 ReactJS 测试 ReactJS CLI 命令 ReactJS 构建和部署 ReactJS 示例

Hooks

ReactJS Hooks 简介 ReactJS 使用 useState ReactJS 使用 useEffect ReactJS 使用 useContext ReactJS 使用 useRef ReactJS 使用 useReducer ReactJS 使用 useCallback ReactJS 使用 useMemo ReactJS 自定义 Hooks

ReactJS 高级

ReactJS 可访问性 ReactJS 代码拆分 ReactJS 上下文 ReactJS 错误边界 ReactJS 转发 Refs ReactJS 片段 ReactJS 高阶组件 ReactJS 与其他库集成 ReactJS 优化性能 ReactJS Profiler API ReactJS Portals ReactJS 不使用 ES6 ECMAScript ReactJS 不使用 JSX 的 React ReactJS Reconciliation ReactJS Refs 和 DOM ReactJS 渲染道具 ReactJS 静态类型检查 ReactJS 严格模式 ReactJS Web 组件

其他概念

ReactJS 日期选择器 ReactJS Helmet ReactJS 内联样式 ReactJS PropTypes ReactJS BrowserRouter ReactJS DOM ReactJS 轮播 ReactJS 图标 ReactJS 表单组件 ReactJS 参考 API

ReactJS 有用资源

ReactJS 快速指南 ReactJS 备忘录 Axios 备忘录 ReactJS 有用资源 ReactJS 讨论


ReactJS - cache()

在 React 18 中,有一个名为"缓存函数"的新功能。该函数会记住向其传递特定输入时发生的情况。因此,如果我们在 React 中处理某些事情时使用具有相同参数的相同函数,它不会重复该工作。相反,它会快速返回记住的结果,从而节省用户的时间和资源。这类似于我们的计算机记住东西以便更高效地执行。

语法

const cachedFunc = cache(func);

参数

func − func 是一个可以使用某些信息执行任务的函数,它可以处理我们提供的任何类型的信息。

返回值

当我们将这个缓存版本的函数与特定输入一起使用时,它会检查它是否已经为这些输入存储了结果。如果有,它会给我们这个结果,而无需再次运行该函数。但如果它没有存储结果,它会使用这些输入运行原始函数,将结果保存在其内存中,然后给我们这个结果。因此,原始函数仅在缓存中没有保存结果时运行。

示例

示例

以下是如何使用 React 18 中的缓存功能的示例。在此示例中,我们将创建一个简单的缓存来计算数字的平方。

import { cache } from 'react';

// 计算数字的平方并缓存结果
export const square = cache(async (num) => {
   console.log(`Calculating the square of ${num}`);
   return num * num;
});

const result1 = await square(5); // 计算并缓存结果
const result2 = await square(5); // 返回记忆化(缓存)结果

console.log(result1); // 计算 5, 25 的平方
console.log(result2); // 25(不重新计算,只返回缓存结果)

// 使用 square 函数
const result3 = await square(3); // 这将计算并缓存结果。
console.log(result3); // 输出:3, 9 的平方

在此示例中,我们创建了一个 square 函数,用于计算并缓存数字的平方。当我们在同一渲染过程中使用相同的输入(例如 5)调用它时,它会返回缓存的结果,从而减少重新计算的需要。当我们使用不同的输入(例如 3)再次调用它时,它会计算并缓存新的结果。

示例 − 为避免重复工作,请使用缓存

这是另一个示例,展示了 React − 中缓存函数的使用

缓存函数用于保存名为 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);
   // 在这里写入代码
}

function SalesDetails({products}) {
   for (let product in products) {
      const stats = getProductStats(product);
      // 在这里写入代码
   }
   // 在这里写入代码
}

如果 ProductDetails 和 SalesReport 中都呈现了相同的产品对象,则这两个组件可以共享工作,并且只为该产品调用一次 calculateProductStats。

假设 ProductDetails 是第一个被呈现的。它将调用 getProductStats 并查看是否存在缓存结果。将发生缓存未命中,因为这是第一次使用该产品调用 getProductStats。然后 getProductStats 将使用该产品调用 calculateProductStats 并将结果保存到缓存中。

当 SalesReport 生成其产品列表并找到相同的产品对象时,它将调用 getProductStats 并从缓存中读取结果。

示例 − 预加载数据

假设我们正在创建一个网页,需要从数据库获取一些数据以在其上显示。此数据提取可能需要一些时间。我们可以使用新的缓存功能在需要数据之前就开始在后台获取数据。

下面是一个例子 −

假设我们有一个 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 }) {
   // 获取产品详细信息
   getProductDetails(productId);

   return (
      <div>
         <h2>Product Information</h2>
         {getProductDetails(productId).description}
      </div>
   );
}

在此示例中,我们有一个 ProductInfo 组件,它使用缓存函数在后台开始接收产品详细信息。这样,当我们需要数据时,它已经在缓存中,从而减少了在页面上显示产品信息所需的时间。

限制

  • 在 React 中处理服务器请求时,每次发出新的服务器请求时,都会清除所有记忆函数的函数缓存结果的内存存储(缓存)。

  • 每次我们使用缓存函数时,都会创建一个新的不同函数。因此,如果我们使用相同的原始函数多次调用缓存,我们会收到单独的记忆函数,并且这些记忆函数不会共享用于保存结果的相同内存存储。

  • 缓存提供的记忆函数也会记住错误。如果原始函数对任何输入返回错误,则该错误将保留在内存中。因此,使用具有相同输入的记忆化函数将导致相同的错误,而无需重新运行该函数。

  • 重要的是,缓存方法仅用于 React 中称为"服务器组件"的部分。它不适用于我们应用程序的其他部分。

摘要

"缓存函数"是 React 18 中新增的一项功能,允许开发人员根据声明的输入轻松存储和检索函数结果。当遇到相同的输入时,通过快速返回缓存结果,可以节省重复计算并提高效率。

reactjs_reference_api.html