React 查询状态机:loading、empty、error 不要互相打架 📅 发布时间:2026/7/5 1:20:14 👁️ 浏览次数: 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 和刷新失败等状态定义清楚再用类型约束非法组合。查询组件稳定不是因为判断写得多而是因为状态空间被设计过。状态机越清楚页面越少出现互相打架的视觉反馈。
图数据库与知识图谱构建实战 引言在关系型数据库中,多表关联查询随着数据规模增长性能急剧下降。而对于高度关联的数据——社交网络、推荐系统、欺诈检测等场景——图数据库提供了天然的优势。知识图谱作为图数据库的高级应用,正在从搜索引擎走向企业级应用,成为AI时代的… 2026/7/5 1:16:12
论文党的开挂装备!常用的AI写作辅助软件,思路秒出超省心 作为一名刚完成毕业论文的过来人,我太懂写论文的痛苦了 —— 选题迷茫、文献查找费时、逻辑梳理困难、内容重复修改、格式调整繁琐... 直到我发现了这套 AI 论文写作工具组合,简直是论文写作的 "开挂神器",效率直接拉满,… 2026/7/5 1:16:12
解锁Java图像处理新境界:TwelveMonkeys ImageIO插件全攻略 解锁Java图像处理新境界:TwelveMonkeys ImageIO插件全攻略 【免费下载链接】TwelveMonkeys TwelveMonkeys ImageIO: Additional plug-ins and extensions for Javas ImageIO 项目地址: https://gitcode.com/gh_mirrors/tw/TwelveMonkeys 你是否曾经在Java项目… 2026/7/5 1:10:10
2026年AI智能体软件行业技术演进与主流厂商能力对比评测分析 引言数字化转型正在经历从流程线上化到业务智能化的根本性跨越。随着大模型技术的突破与落地,企业管理软件的底层逻辑发生了深刻变化,传统的流程审批与记录系统正在向能够自主感知、分析、决策与执行的智能平台演进。在这一进程中,AI智能体软… 2026/7/5 2:30:37
山西瓷砖勾缝批发 在家装与工装领域,瓷砖勾缝早已从简单的填缝工序,演变为影响整体美观与耐用性的关键环节。面对市场上琳琅满目的勾缝产品与批发渠道,消费者与工程采购方往往面临“选择困难症”。本文结合当前【山西美缝剂】行业的发展现状,深入剖… 2026/7/5 2:30:37
JSON转表格使用教程:从入门到精通 什么是 JSON 转表格工具? JSON 转表格工具将 JSON 数据转换为美观的 HTML 表格,方便在网页中展示数据。这对于前端开发、数据分析展示和快速数据预览来说非常实用,尤其适合在博客文章、技术文档和管理后台中展示结构化数据。 逐步操作指南 … 2026/7/5 2:28:37
ICML 2026 | 时间序列(Time Series)论文总结【基础模型,生成,分类,异常检测,插补,表示学习和分析等】 ICML 2026将在2026年7月6日—11日于韩国首尔(Seoul, South Korea)举行。本文总结了2026 ICML上有关时间序列(time series)相关论文。如有疏漏,欢迎大家补充。 注:由于时间序列(标题包含time ser… 2026/7/5 2:26:36
从零到一:使用OWASP ZAP对DVWA进行自动化安全扫描实战 1. 环境准备与工具安装第一次接触OWASP ZAP和DVWA时,最头疼的就是环境搭建。我当初在Kali Linux上折腾了半天,后来发现用Docker能省去80%的配置时间。这里分享两种我最常用的部署方式:Kali原生安装方案(适合喜欢折腾的玩家&#x… 2026/7/5 2:24:36
【JAVA毕设源码分享】基于springboot毕业设计双选系统的设计与实现(程序+文档+代码讲解+一条龙定制) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/5 2:24:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36