当前位置: 首页 > news >正文

React 的 `cache()` 函数

文章目录

  • 前言
      • 一、核心作用
      • 二、工作原理
      • 三、使用场景
        • 1. 避免重复数据请求
        • 2. 优化昂贵计算
      • 四、缓存规则详解
      • 五、与其它缓存方式对比
      • 六、服务端特殊行为
      • 七、最佳实践
      • 八、缓存失效策略
      • 九、使用限制
      • 十、与数据获取库集成
      • 总结:何时使用 cache()


前言

React 的 cache() 函数是 React 19 引入的重要 API,主要用于优化重复计算和数据获取。以下是对 cache() 函数的详细解析:


一、核心作用

cache() 创建一个缓存版本的函数,当相同参数重复调用时直接返回缓存结果:

import { cache } from 'react';const cachedFn = cache(fn);

二、工作原理

  1. 首次调用:执行函数并缓存结果
  2. 相同参数再次调用:直接返回缓存值(不执行函数)
  3. 不同参数调用:重新执行并缓存新结果

三、使用场景

1. 避免重复数据请求
const getData = cache(async (id) => {const res = await fetch(`https://api.example.com/data/${id}`);return res.json();
});async function Component({ id }) {const data = await getData(id); // 相同id只请求一次
}
2. 优化昂贵计算
const calculateSum = cache((a, b) => {// 复杂计算逻辑return a + b; 
});function Component() {const result = calculateSum(5, 10); // 相同参数直接返回缓存
}

四、缓存规则详解

行为结果
相同参数调用返回缓存值
不同参数调用执行函数并缓存新结果
服务端组件间调用同一请求共享缓存
客户端组件间调用整个应用生命周期共享缓存

五、与其它缓存方式对比

方法适用场景缓存范围持久性
cache()跨组件/服务端-客户端全局请求/会话级
useMemo单组件内部组件实例渲染周期
useCallback事件处理函数组件实例依赖变更前
React.memo组件渲染结果组件实例Props 不变时

六、服务端特殊行为

在 RSC(服务器组件)中:

  1. 缓存自动绑定到当前请求
  2. 请求结束时缓存自动清除
  3. 不同请求之间的缓存完全隔离
// 服务端组件
export default async function Page() {const data = await getData(1); // 缓存绑定到该HTTP请求
}

七、最佳实践

  1. 纯函数优先:只缓存无副作用的函数

    // ✅ 推荐:纯函数
    const getPrice = cache((productId) => ...)// ❌ 避免:有副作用函数
    const updateDB = cache(() => { ... }) // 危险!
    
  2. 客户端组件使用注意

    'use client';
    import { cache } from 'react';// 客户端需单例模式
    const cachedFn = cache(fn);
    export default function ClientComp() {// 使用cachedFn
    }
    
  3. 避免缓存大型对象

    // ❌ 不推荐
    const getHugeData = cache(() => 1GB数据)// ✅ 推荐
    const getDataChunk = cache((chunkId) => 小块数据)
    

八、缓存失效策略

React 未内置失效机制,需手动实现:

// 自定义带失效时间的缓存
const createTimedCache = (fn, ttl = 60_000) => {const cache = new Map();return (...args) => {const key = JSON.stringify(args);if (cache.has(key)) {const { timestamp, value } = cache.get(key);if (Date.now() - timestamp < ttl) return value;}const value = fn(...args);cache.set(key, { value, timestamp: Date.now() });return value;};
};

九、使用限制

  1. 参数必须可序列化:对象/数组需结构稳定
  2. 避免闭包陷阱
    function Component() {// ❌ 错误:每次渲染创建新函数const badCache = cache((x) => ...);// ✅ 正确:模块级缓存return <Child />
    }// 模块级缓存
    const goodCache = cache((x) => ...);
    

十、与数据获取库集成

配合 Next.js / SWR 等库:

// Next.js 示例
import { cache } from 'react';export const revalidate = 3600; // 每小时重新验证const getData = cache(async (id) => {const res = await fetch(`https://...`);return res.json();
});export async function generateStaticParams() {const data = await getData();return data.map(item => ({ id: item.id }));
}

总结:何时使用 cache()

场景推荐使用
跨组件共享数据获取逻辑
避免重复 API 请求
计算密集型操作优化
事件处理函数
状态更新逻辑
需要即时失效的缓存❌ (需扩展)

通过合理使用 cache(),可显著提升 React 应用性能,特别在 RSC 架构中能有效减少不必要的计算和网络请求。

http://www.xdnf.cn/news/1149517.html

相关文章:

  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(下)
  • Java行为型模式---状态模式
  • 6-大语言模型—预训练:数据处理
  • SpringBoot项目部署至云服务器
  • simulink系列之汽车应用层信号处理
  • Django母婴商城项目实践(九)- 商品列表页模块
  • LVS的简介以及架构
  • Entity Component System架构
  • 【项目分享】动手做一个TypeC转TTL模块(附带原理图)
  • 加法速算之尾数法
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用
  • java: DDD using sql server 2019 or Oracle21c
  • Linux 密码生成利器:pwgen 命令详解
  • 测试计划(抽奖系统)
  • 考研复习-数据结构-第七章-查找
  • Linux“一切皆文件“设计哲学 与 Linux文件抽象层:struct file与file_operations的架构解析
  • 我做的基础服务项目,是如何实现 API 安全与限流的(短信、邮件、文件上传、钉钉通知)
  • Jenkins 实现项目的构建和发布
  • 企业运维实战:Jenkins 依赖 JDK21 与应用需 JDK1.8 共存方案(含流水线配置)
  • 【ExtendScript Toolkit CC】【PR插件开发】获取当前序列的所有剪辑片段名
  • Java 性能调优实战:JVM 参数配置与 GC 日志分析
  • 深度学习-线性神经网络
  • QCC系列显示交互层的自研技术突破与实践
  • 本地大模型部署工具全解析:LM Studio vs. Ollama 及最佳实践指南
  • 81、【OS】【Nuttx】【启动】caller-saved 和 callee-saved 示例:压栈内容
  • Mybatis学习之简介(一)
  • Django接口自动化平台实现(三)
  • 多式联运物流管理系统的设计与实现(原创)
  • picoCTF 2024: [[NoSQL]] Injection - Writeup
  • 【MATLAB例程】Taylor算法用于TOA(到达时间)的三维标签位置解算,可自适应基站数量。附下载链接