React 查询状态机:loading、empty、error 不要互相打架
React 查询状态机loading、empty、error 不要互相打架一、查询状态不是三个布尔值很多 React 页面会把接口状态写成三个布尔值loading、error、empty。一开始这样写很快但页面复杂后就容易出现互相打架的状态请求还在 loading却已经展示 empty接口失败了但旧数据还留在页面上用户点击重试时错误提示和骨架屏同时出现。查询状态应该被当成一个状态机而不是几个随手追加的变量。尤其是列表、报表、详情页这类常见业务界面用户看到的不只是数据还包括等待、失败、空结果、刷新和保留旧数据的过程。二、先定义页面允许出现的状态stateDiagram-v2 [*] -- idle idle -- loading loading -- success loading -- empty loading -- error success -- refreshing refreshing -- success refreshing -- errorWithStaleData error -- loading一个查询页面至少要区分初次加载和后台刷新。初次加载没有旧数据适合展示骨架屏后台刷新已有旧数据直接清空页面会让用户产生跳动感。错误也要分两类完全没有数据时的错误和有旧数据但刷新失败的错误。如果这些状态没有提前定义组件里就会出现很多条件判断if (loading !data) return Skeleton / if (error !data) return ErrorView / if (!loading data?.length 0) return Empty /这段代码看似清楚但随着筛选、分页、重试、自动刷新加入判断会越来越难维护。三、用联合类型收敛非法组合type QueryStateT | { tag: idle } | { tag: loading } | { tag: success; data: T; refreshing: boolean } | { tag: empty } | { tag: error; message: string } | { tag: errorWithStaleData; data: T; message: string }联合类型的好处是把非法组合挡在类型层。例如error状态不应该同时携带refreshing: trueempty状态也不应该携带一组空数组再让视图自己猜。组件渲染时只关心tag每个分支拿到的字段都是合法的。function renderUsers(state: QueryStateUser[]) { switch (state.tag) { case loading: return UserSkeleton / case empty: return EmptyUsers / case error: return ErrorPanel message{state.message} / case errorWithStaleData: return UserTable rows{state.data} warning{state.message} / case success: return UserTable rows{state.data} busy{state.refreshing} / } }这类写法也方便 AI 辅助生成测试。因为每个状态都有明确输入模型不需要猜某个布尔值组合到底代表什么。联合类型定义好之后还有一个容易被忽略的细节筛选条件变化时的状态迁移。用户在列表页切换筛选条件时应该回到 loading 状态还是直接清空旧数据直接清空会让页面内容突然消失但保留旧数据再显示 loading 又会让人困惑。更稳的做法是区分“从 success 重新加载”和“初次进入”function applyFilter(state: QueryStateUser[], newFilters: Filters): QueryStateUser[] { if (state.tag success || state.tag errorWithStaleData) { return { tag: loading, staleData: state.tag success ? state.data : state.data } } return { tag: loading } }这个staleData字段让组件在加载新筛选结果时用户仍然能看到上次的数据。和前文refreshing的设计逻辑一致都是避免页面在用户已经看到内容后突然变空。实际项目里筛选联动如果没有 staleData用户每改一次条件就看到一帧空白体验会很碎。加上之后再用半透明遮罩或骨架叠在旧数据上反馈感就会自然很多。四、缓存库也需要页面语义React Query、SWR 这类库已经提供isLoading、isFetching、isError等字段但这些字段是数据层语义不一定等于页面语义。页面仍然要把它们映射成自己的状态机。function toPageState(query: UseQueryResultUser[]): QueryStateUser[] { if (query.isLoading) return { tag: loading } if (query.isError !query.data) return { tag: error, message: 加载失败请重试 } if (query.isError query.data) { return { tag: errorWithStaleData, data: query.data, message: 刷新失败当前展示旧数据 } } if (!query.data || query.data.length 0) return { tag: empty } return { tag: success, data: query.data, refreshing: query.isFetching } }工程里还要约定验收口径初次加载是否允许展示旧缓存筛选条件变化时是否清空列表分页失败是否回退页码自动刷新失败是否弹 toast。这些不是库能替你决定的事而是产品体验和前端状态共同决定的边界。分页失败的回退尤其容易被忽略。用户从第 2 页翻第 3 页接口返回了 500。此时如果页码已经更新到 3但数据还停在旧页用户的认知就会分裂。更合理的做法是分页请求失败时页码不递增并在当前页顶部弹出轻量提示第 3 页加载失败已停留在当前页而不是把整个列表切到 error 状态。五、总结React 查询状态要从页面语义出发把 loading、empty、error、success 和刷新失败等状态定义清楚再用类型约束非法组合。查询组件稳定不是因为判断写得多而是因为状态空间被设计过。状态机越清楚页面越少出现互相打架的视觉反馈。

相关新闻

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 你是否…

2026/7/5 1:21:28阅读更多 →
在线格式转换:PDF转Word+图片+视频+音频,各类格式随意转换

在线格式转换:PDF转Word+图片+视频+音频,各类格式随意转换

今天我要向大家推荐一个在线格式转换网站,它几乎支持所有常见的文件格式,比如PDF、文档、图片、视频、音频和电子书等等!不需要安装额外的软件,可以直接在线转换!■ aconvert在线格式转换(网站)…

2026/7/5 1:21:28阅读更多 →
Serverless架构设计与无服务器应用开发

Serverless架构设计与无服务器应用开发

引言 Serverless(无服务器)架构正在重新定义应用开发和部署的方式。开发者无需关心服务器管理、容量规划和基础设施运维,只需专注于业务逻辑的实现。AWS Lambda、阿里云函数计算、腾讯云SCF等Serverless平台,让"按需运行、按…

2026/7/5 1:16:27阅读更多 →
本地部署AI编程助手:Codex CLI与Claude Code实战指南

本地部署AI编程助手:Codex CLI与Claude Code实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一个能本地部署、支持批量任务、并且能通过 API 调用的 AI 编程助手,那么 Codex CLI 和 Claude Code 这两个…

2026/7/5 2:36:32阅读更多 →
【Springboot毕设全套源码+文档】基于springcloud3校园物资交互系统的设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springcloud3校园物资交互系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 2:36:32阅读更多 →
【JAVA毕设源码分享】基于springcloud3校园物资交互系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springcloud3校园物资交互系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 2:36:32阅读更多 →
开源编程助手 MIMO Code 简介和简单使用测试

开源编程助手 MIMO Code 简介和简单使用测试

一、什么是 MIMO Code? 1.1 MIMO Code 简介 小米 MiMo Code V0.1.0 是小米基于终端原生架构开发的开源 AI 编程助手,核心突破在于通过持久记忆系统解决长程任务中的上下文丢失问题。 在 SWE-Bench Pro V2 和 Terminal Bench 2 两大权威测试中&#xff…

2026/7/5 2:36:32阅读更多 →
2026年AI超级公司系统软件行业趋势与主流厂商能力评测解析

2026年AI超级公司系统软件行业趋势与主流厂商能力评测解析

引言 数字化转型步入深水区,企业管理软件正经历从流程驱动向智能驱动的范式跃迁。传统ERP系统聚焦于资源规划与流程固化,而在AI技术全面渗透的当下,AI超级公司系统软件已经从单一的流程管理工具演进为全域经营智能平台。企业对系统的诉求不再…

2026/7/5 2:36:32阅读更多 →
Web安全攻防实战:从SQL注入到DDoS的防御指南

Web安全攻防实战:从SQL注入到DDoS的防御指南

1. 项目概述:Web安全攻防的永恒战场干了十几年Web开发和安全,我越来越觉得,搞Web安全就像是在给一座不断扩建的城堡修围墙。你这边刚把大门加固好,那边就有人开始琢磨着挖地道、搭云梯,甚至伪装成送外卖的混进来。今天…

2026/7/5 2:31:31阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →