使用 useCallback 在 useSWR 中缓存您的 fetcher

我在gitroom源代码中找到了一种使用usecallback在useswr中缓存fetcher的方法。

使用 useCallback 在 useSWR 中缓存您的 fetcher

上图来自platform-analytics/render.analytics.tsx。让我们尝试理解这段代码。

我们将探索如何结合使用 usecallback 钩子和 useswr 来优化 react 应用程序中的数据获取。我们将分解提供的代码片段,解释为什么缓存 fetcher 函数很重要。

理解代码

让我们一步步深入代码:

const load = usecallback(async () => {  setloading(true);  const load = (    await fetch(`/analytics/${integration.id}?date=${date}`)  ).json();  setloading(false);  return load;}, [integration, date]);

登录后复制

在这里,我们在 usecallback 挂钩内定义异步函数加载。该函数从指定端点获取数据并处理加载状态。 usecallback 挂钩确保此函数被记忆,并且仅在依赖项(集成和日期)更改时重新创建。

接下来,我们使用 useswr 来管理数据获取:

const { data } = useswr(`/analytics-${integration?.id}-${date}`, load, {  refreshinterval: 0,  refreshwhenhidden: false,  revalidateonfocus: false,  revalidateonreconnect: false,  revalidateifstale: false,  refreshwhenoffline: false,  revalidateonmount: true,});

登录后复制

这里,useswr 配置了一个键(/analytics-${integration?.id}-${date})和我们的记忆加载函数。配置选项控制数据的重新验证行为。

usecallback 如何防止不必要的重新获取

要了解 usecallback 如何防止不必要的重新获取,我们需要深入研究 react 如何处理函数引用以及 useswr 如何工作。

react 中的函数引用

在 react 中,每次组件重新渲染时,都会重新创建其中定义的所有函数。这意味着如果没有 usecallback,将在每次渲染时创建加载函数的新实例。

使用 useCallback 在 useSWR 中缓存您的 fetcher

对 useswr 的影响

useswr 是 react 的数据获取库。它使用密钥来识别数据,并使用获取器函数来获取数据。 useswr 依赖于 fetcher 函数引用的稳定性。如果引用发生变化,useswr 可能会将其解释为需要重新获取数据的信号,即使获取器的实际逻辑没有改变。

详细解释如下:

没有 usecallback:

const load = async () => {  setloading(true);  const load = (    await fetch(`/analytics/${integration.id}?date=${date}`)  ).json();  setloading(false);  return load;};const { data } = useswr(`/analytics-${integration?.id}-${date}`, load, {  refreshinterval: 0,  refreshwhenhidden: false,  revalidateonfocus: false,  revalidateonreconnect: false,  revalidateifstale: false,  refreshwhenoffline: false,  revalidateonmount: true,});

登录后复制

在这种情况下,每个渲染都会创建一个新的加载函数。 useswr 每次都会看到不同的函数引用,即使集成和日期没有更改,这也可能导致不必要的重新获取。

with usecallback:

const load = useCallback(async () => {  setLoading(true);  const load = (    await fetch(`/analytics/${integration.id}?date=${date}`)  ).json();  setLoading(false);  return load;}, [integration, date]);const { data } = useSWR(`/analytics-${integration?.id}-${date}`, load, {  refreshInterval: 0,  refreshWhenHidden: false,  revalidateOnFocus: false,  revalidateOnReconnect: false,  revalidateIfStale: false,  refreshWhenOffline: false,  revalidateOnMount: true,});

登录后复制

通过将 load 函数包装在 usecallback 中,我们确保仅在其依赖项(集成和日期)发生变化时才重新创建它。函数引用的这种稳定性告诉 useswr,除非集成或日期发生变化,否则获取器函数不会改变,从而防止不必要的重新获取。

想学习如何从头开始构建 shadcn-ui/ui 吗?查看 从头开始构建

关于我:

网站:https://ramunarasinga.com/

linkedin:https://www.linkedin.com/in/ramu-narasinga-189361128/

github:https://github.com/ramu-narasinga

电子邮件:ramu.narasinga@gmail.com

从头开始构建 shadcn-ui/ui

参考:

https://github.com/gitroomhq/gitroom/blob/c03b96215fa30b267a97d7eafc2281f482a3192f/apps/frontend/src/components/platform-analytics/render.analytics.tsx#l25 https://github.com/search?q=repo%3agitroomhq%2fgitroom%20useswr&type=code https://swr.vercel.app/docs/getting-started https://react.dev/reference/react/usecallback

以上就是使用 useCallback 在 useSWR 中缓存您的 fetcher的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2672284.html

(0)
上一篇 2025年3月7日 13:24:30
下一篇 2025年3月7日 00:03:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 缓存

    向您介绍Encache!! 轻量级,易于为您的Nodejs服务器使用Async缓存库。 Encache 是作为 NPM 上可用的所有现有内存中易失性缓存库的下一个迭代而开发的,将其提升到一个全新的水平,同时保持简单性,因为整个缓存只需 4 …

    2025年3月7日
    200
  • 在 Javascript 中使用此函数将字符串转换为驼峰命名法

    曾经需要将字符串转换为驼峰命名法吗?我在探索开源 supabase 存储库时发现了一个有趣的代码片段。这是他们使用的方法: function featuretocamelcase(feature: feature) { return fea…

    2025年3月7日
    200
  • 我如何在启动 ScriptKavi/Hooks 后数周内获得星星

    介绍 当我第一次构想 scriptkavi/hooks 时,我的目标是创建一个能够简化 React 应用程序中的状态管理和副作用的库。作为一名热衷于干净代码和高效开发工作流程的开发人员,我看到需要一种可以简化这些流程的工具。我几乎不知道,在…

    2025年3月7日
    200
  • JavaScript 中的地址格式

    地址是我们日常生活的基本组成部分,无论我们是发送邮件、订购包裹还是导航到新位置。但在代码中处理地址时,事情可能会变得棘手。不同的国家/地区具有独特的地址格式,即使在同一个国家/地区内,地址的结构也可能存在差异。在本指南中,我们将探讨地址格式…

    2025年3月7日
    200
  • 卢迪亚纳的全栈网站开发课程

    在 Digital Grow Up,我们经过认证的全栈 Web 开发课程经过精心设计,旨在为您提供网页设计和开发方面的坚实基础。从 HTML 和 CSS 到高级 JavaScript 和数据库管理,我们确保您做好充分准备来应对实际项目。不要…

    2025年3月7日
    200
  • 如何开始使用 Git 和 GitHub

    git 和 github 入门是管理代码、与他人协作和跟踪更改的好方法。这是帮助您入门的分步指南: 2.了解基础知识 git: 一个版本控制系统,用于跟踪文件的更改并协调多人对这些文件的工作。github: 基于云的 git 存储库托管服务…

    2025年3月7日
    200
  • 使用 Nodejs 和 MongoDB 本机驱动程序构建快速灵活的 CRUD API

    将 node.js 和 express 与 mongodb 本机驱动程序结合使用:原因和方式 如果您使用 node.js 和 express,您可能遇到过 mongoose,这是一个流行的 mongodb odm(对象数据建模)库。虽然 m…

    2025年3月7日
    200
  • 领导并留住开发人员

    很明显,公司是多么努力地留住软件工程师、开发人员、数据科学家和其他技术专业人员。他们试图让工作环境尽可能凉爽,在办公室里放置了爆米花机、各种零食、装有啤酒和软饮料的迷你吧、乒乓球桌、电子游戏、泡芙,甚至愿意付费购买技术、英语,访问 Netf…

    2025年3月7日
    200
  • 代码之旅:使用 Nextjs、Tailwind CSS 和 Framer Motion 打造我的开发者组合

    一个想法的起源在一个以快速技术发展为主导的世界中,作为一名 Web 开发人员要想脱颖而出,往往取决于一个关键的工件:产品组合。正是在这个数字复兴时期,我决定打造我的项目——不仅仅是作为项目的展示,也是我在现代网络技术方面的旅程和专业知识的证…

    2025年3月7日
    200
  • 我的第一个拉取请求刚刚被接受!

    我的第一个拉取请求刚刚被接受! ? 今天,我正在庆祝我对 GitHub 社区的第一个开源贡献。 这对我来说是一件大事。我正在从事开源项目,这意味着我无法通过构建 Easy UI 获得报酬 – [ https://www.easy…

    2025年3月7日
    200

发表回复

登录后才能评论