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

组件重新装载时 useSWR 会发起请求

默认情况下,组件重新装载时 useSWR 会发起请求。这是 SWR "stale-while-revalidate" 设计哲学的一部分。

重新装载时的行为

function MyComponent() {const { data } = useSWR('/api/data', fetcher)// 组件卸载又重新挂载时:// 1. 立即显示缓存数据(如果存在)// 2. 在后台发起新请求验证数据是否更新// 3. 如果有更新,静默替换数据
}

重新装载的常见场景

场景1:路由导航

// 从 /page-a 导航到 /page-b,再返回 /page-a
// PageA 组件会卸载又重新挂载,触发重新验证
function PageA() {const { data } = useSWR('/api/page-a', fetcher) // 重新挂载时会请求return <div>Page A: {data}</div>
}

场景2:条件渲染

function ToggleComponent() {const [show, setShow] = useState(true)return (<div><button onClick={() => setShow(!show)}>Toggle</button>{show && <DataComponent />} // 切换时会卸载/重新挂载</div>)
}function DataComponent() {const { data } = useSWR('/api/data', fetcher) // 重新显示时会请求return <div>{data}</div>
}

场景3:键值变化导致的重新挂载

function UserProfile({ userId }) {// 当 userId 变化时,组件实际上会重新挂载const { data } = useSWR(`/api/user/${userId}`, fetcher)return <div>User: {data?.name}</div>
}

如何控制重新装载时的行为

1. 完全禁止重新验证

const { data } = useSWR('/api/data', fetcher, {revalidateOnMount: false // 重新挂载时不请求
})

2. 智能控制(推荐)

const { data } = useSWR('/api/data', fetcher, {revalidateIfStale: false // 有缓存就不重新验证,如果 key 发生变化或者存在定时刷新,useSWR 也会正常发起新的请求。
})

3. 使用不可变数据

import useSWRImmutable from 'swr/immutable'const { data } = useSWRImmutable('/api/data', fetcher) // 永远不会自动重新验证

4. 延长去重间隔

const { data } = useSWR('/api/data', fetcher, {dedupingInterval: 60000 // 60秒内避免重复请求
})

为什么这是默认行为?

useSWR 选择在重新装载时请求是因为:

  1. 数据新鲜度:确保用户看到最新数据
  2. 后台更新:用户体验无中断(先显示缓存,后台更新)
  3. 一致性:保持多设备间数据同步
  4. 错误恢复:自动重试失败的请求

实际应用建议

// 根据数据类型选择合适的策略
function SmartComponent() {// 实时数据:使用默认行为const { data: notifications } = useSWR('/api/notifications', fetcher)// 静态数据:禁止重新验证const { data: countries } = useSWR('/api/countries', fetcher, {revalidateIfStale: false})// 用户数据:中等刷新频率const { data: user } = useSWR('/api/user', fetcher, {dedupingInterval: 30000 // 30秒内不重复请求})return <div>{/* ... */}</div>
}

总结:组件重新装载时默认会请求,这是为了保持数据新鲜度。你可以通过配置来精确控制这个行为。

http://www.jsqmd.com/news/518/

相关文章:

  • kettle插件-kettle数据清洗插件,轻松处理脏数据
  • Java 如何在 Excel 中添加超链接?使用 Spire.XLS for Java 轻松实现 - 教程
  • 中二
  • RocketMQ vs RabbitMQ vs Kafka - 教程
  • 实用指南:设计模式概述
  • web应用程详解part1
  • Seedream 4.0 简直绝了!
  • 财务管理NPV与IRR投资分析在IT行业案例
  • 优化sigmoid
  • mysql查询死锁,mysql查询死锁方法
  • 【IEEE出版、已连续5届稳定快速EI检索】第六届计算机工程与智能控制学术会议(ICCEIC 2025)
  • 软工第二次作业之个人项目——论文查重
  • 对实体类Id自增
  • HarmonyOS之UIContext 与 UIAbility、WindowStage 的关系 - 指南
  • 向上一步——当做事纠结的人停止决策内耗,你就是掌控自己的神!
  • Windows平台安装cocos2d-x V3.17.2
  • 完整教程:Mistral Document AI已正式登陆Azure AI Foundry(国际版)
  • 深入解析:InnoDB存储引擎-锁
  • 飞书机器人推送消息通知用自定义机器人
  • 深入解析:vue 批量自动引入并注册组件或路由
  • ENSP 常用命令
  • Kubernetes权威指南-基础篇
  • 【IEEE出版、已连续6届EI稳定检索】第七届机器学习、大数据与商务智能国际会议 (MLBDBI 2025)
  • 构建AI智能体:三十八、告别“冷启动”:看大模型如何解决推荐系统的世纪难题 - 实践
  • office2024安装教程(附安装包)Office 2024 专业增强版下载安装激活详细图文步骤
  • EMS 抗扰度在边缘计算产品电路设计的基本问题 - 教程
  • 20231326王荣盛《密码系统设计》第二周预习报告
  • Gitflow 工作流程
  • 魔改chromium真正通杀全网debugger检测
  • C#依赖注入