HarmonyOS ArkUI 页面状态乱了怎么办:中式美食怎么把加载、空态、错误和正文分开
中式美食的菜谱列表页一开始数据少页面状态怎么写都能看起来正常。等搜索、分类、分页、网络失败、本地空数据都进来以后问题就出来了正在加载时显示“暂无数据”请求失败后旧列表还在下面刷新时页面闪白。这个时候不要先改样式先把页面状态拆清楚。先说清楚有哪些状态一个列表页至少有四种主状态加载中、空结果、错误、正常内容。它们不能同时抢主画面。状态什么时候出现不能和谁同时出现loading首次加载或重新搜索empty、errorempty请求成功但没有数据loading、errorerror请求失败且没有可用数据loading、emptycontent有列表数据首屏 loading为什么要这么拆原因是用户只关心当前页面到底发生了什么。如果页面同时告诉他“正在加载”和“暂无数据”他会以为搜索没结果如果错误提示盖着旧内容他又不知道旧内容还能不能点。坏写法多个布尔值互相打架很多页面一开始会这样写Stateloading:booleanfalseStateempty:booleanfalseStateerror:booleanfalseStaterecipes:RecipeCardVM[][]问题是这几个布尔值可能被不同分支修改最后出现矛盾。asyncloadRecipes(keyword:string){this.loadingtruetry{this.recipesawaitRecipeRepository.instance.search(keyword)this.emptythis.recipes.length0}catch(err){this.errortrue}this.loadingfalse}这段代码少了几件事请求成功时没有清掉 error请求失败时没有处理 empty下一次搜索开始时也没有把旧状态重置。结果页面很容易一边有数据、一边还挂着错误。好写法用一个 pageState 收口我更愿意用一个主状态字段把页面当前状态收口。typePageStateloading|empty|error|contentStatepageState:PageStateloadingStaterecipes:RecipeCardVM[][]StateerrorText:string加载时只改这个状态asyncloadRecipes(keyword:string){this.pageStateloadingthis.errorTexttry{constnextawaitRecipeRepository.instance.search(keyword)this.recipesnextthis.pageStatenext.length0?content:empty}catch(err){this.recipes[]this.errorText菜谱加载失败稍后再试this.pageStateerror}}这样写的好处是清楚。页面任意时刻只有一种主状态不会同时 empty 又 error也不会 loading 结束后忘了清掉旧错误。ArkUI 里怎么展示页面构建时也按主状态分支不要在一堆if里反复插组件。build(){Column(){SearchBar({value:this.keyword,onSearch:(value:string)this.loadRecipes(value)})if(this.pageStateloading){LoadingPanel()}elseif(this.pageStateempty){EmptyPanel({keyword:this.keyword})}elseif(this.pageStateerror){ErrorPanel({message:this.errorText,onRetry:()this.loadRecipes(this.keyword)})}else{RecipeList({recipes:this.recipes})}}}这段代码看起来普通但实际能解决很多乱象。加载、空态、错误、正文的位置固定状态变化时不会互相叠。写法页面表现后期维护多个布尔值分散控制容易互相叠每加一个状态都要到处改一个 pageState 收口主画面稳定状态入口清楚数据和状态混着判断边界模糊容易误判空态状态不要从组件里面反推还有一个坑子组件里自己判断空态。比如RecipeList里面发现recipes.length 0就自己显示暂无数据。外层页面又根据pageState显示EmptyPanel最后空态可能出现两次。更稳的做法是父页面决定主状态子组件只展示自己该展示的内容。Componentstruct RecipeList{Proprecipes:RecipeCardVM[]build(){List(){ForEach(this.recipes,(item:RecipeCardVM){ListItem(){RecipeCard({recipe:item})}},(item:RecipeCardVM)item.id)}}}RecipeList不处理 empty也不处理 error。它只负责“有数据时怎么排列表”。这样组件职责清楚后面你要换空态图、错误文案、重试按钮都在页面层改不会藏在列表组件里面。组件负责什么不负责什么页面容器判断 pageState具体卡片内部样式RecipeList渲染列表空态、错误态EmptyPanel展示空态和引导重新查数据ErrorPanel展示错误和重试按钮直接改 recipes这种拆法看起来多了几个小组件实际是在避免状态分散。页面状态一旦散到多个组件里后期加分页、筛选、重试时就很难判断到底是谁把页面改成了空态。搜索和分类要带上请求版本如果页面有搜索输入还要注意请求返回顺序。用户连续输入“红”“红烧”“红烧肉”可能后发的请求先回来先发的请求后回来。这个时候如果没有请求版本旧结果可能覆盖新结果。privaterequestVersion:number0asyncsearch(keyword:string){constversionthis.requestVersionthis.pageStateloadingtry{constnextawaitRecipeRepository.instance.search(keyword)if(version!this.requestVersion){return}this.recipesnextthis.pageStatenext.length0?content:empty}catch(err){if(version!this.requestVersion){return}this.errorText搜索失败稍后再试this.pageStateerror}}这段代码解决的是另一个常见错觉页面不是状态判断错了而是旧请求回来得太晚把新状态盖掉了。搜索、分类、排序同时存在时这个问题更明显。刷新时不要闪白有一种细节要分开首次加载和已有内容刷新。首次进入页面没有数据可以显示 loading但用户已经看到列表后再下拉刷新或切换排序不一定要把整页切到 loading否则页面会闪白。StatepageState:PageStateloadingStaterefreshing:booleanfalseasyncrefreshRecipes(){if(this.recipes.length0){this.pageStateloading}else{this.refreshingtrue}try{constnextawaitRecipeRepository.instance.search(this.keyword)this.recipesnextthis.pageStatenext.length0?content:empty}finally{this.refreshingfalse}}这里的判断标准是没有旧内容时用主 loading有旧内容时用局部 refreshing。这样用户不会每次筛选都看到整页消失。怎么验证这个页面状态问题要用不同路径测。验证动作期待结果能发现什么首次打开有数据先 loading再 content首屏状态是否正确搜索不存在的菜显示 empty空态是否误叠 loading模拟查询失败显示 error错误是否清掉旧空态有列表时刷新列表不闪白refreshing 是否和 loading 分开错误后重试成功回到 contenterror 是否被清掉我会特别看“错误后重试成功”。如果重试成功了但错误提示还在说明状态没有收口。以后怎么避免以后写 ArkUI 页面时先别急着堆组件。先把页面主状态列出来再决定每个状态对应什么 UI。数据为空不等于页面空态请求中也不等于没有数据。中式美食里搜索页、分类页、收藏页、购物清单页都可以用这套思路。一个pageState管主画面一个refreshing管局部刷新一个errorText管错误文案。边界清楚后页面不会因为多一个筛选条件就开始乱跳也不会让用户看见“正在加载”和“暂无数据”同时出现。

相关新闻

10分钟打造专业AI歌手:RVC WebUI语音克隆终极指南

10分钟打造专业AI歌手:RVC WebUI语音克隆终极指南

10分钟打造专业AI歌手&#xff1a;RVC WebUI语音克隆终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-…

2026/10/13 7:30:57 阅读更多 →
管家婆软件能解决的具体经营问题

管家婆软件能解决的具体经营问题

一、库存管理类&#xff1a;解决「货管不清、资金被存货套牢」 1、手工盘库耗时、账实对不上 扫码出入库、多仓 / 多门店实时同步库存&#xff0c;一键盘点、自动生成报损报溢单&#xff0c;不用熬夜手工对账&#xff0c;库存流水全程可追溯。 2、盲目进货&#xff1a;要么断货…

2026/10/13 7:44:28 阅读更多 →
UABEAvalonia:跨平台Unity资源编辑终极指南,告别Windows依赖

UABEAvalonia:跨平台Unity资源编辑终极指南,告别Windows依赖

UABEAvalonia&#xff1a;跨平台Unity资源编辑终极指南&#xff0c;告别Windows依赖 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA UABEAvalonia是一个基于Avalonia框架开发的跨平台Unity资源编辑器&…

2026/10/11 20:16:48 阅读更多 →

最新新闻

fiji-win64 安装、宏脚本与插件管理:ImageJ 生物图像分析实战指南

fiji-win64 安装、宏脚本与插件管理:ImageJ 生物图像分析实战指南

简介&#xff1a;Fiji&#xff08;ImageJ&#xff09;是一个面向 Windows 六十四位系统的免安装图像处理软件&#xff0c;专门服务于科研和医学图像分析用户。解压后不需要安装即可运行&#xff0c;能够直接读取 Raw 格式原始数据&#xff0c;对八位以上的高动态范围图像支持良…

2026/10/13 17:32:45 阅读更多 →
DeepSeek V4.1 Flash:低延迟大模型推理引擎实战解析

DeepSeek V4.1 Flash:低延迟大模型推理引擎实战解析

1. 项目概述&#xff1a;这不是一次常规升级&#xff0c;而是一次“响应速度革命”最近在多个技术社区和开发者群聊里&#xff0c;几乎每天都能刷到类似这样的消息&#xff1a;“DeepSeek V4.1 Flash 内测开了”“Flash 版推理延迟压到 87ms”“实测比上一代 V4 Pro 在长文本场…

2026/10/13 17:32:45 阅读更多 →
SpringBoot多数据源读写分离实战:从配置到高可用路由

SpringBoot多数据源读写分离实战:从配置到高可用路由

1. 为什么多数据源不是“加个配置就行”的事——从一次线上慢查询告警说起“SpringBoot配置多数据源”这个标题&#xff0c;听起来像教科书里的一个练习题&#xff1a;改几行yml&#xff0c;贴几段代码&#xff0c;跑通就完事。但我在某电商中台项目里连续踩了三个月的坑之后才…

2026/10/13 17:32:45 阅读更多 →
DeepSeek V4.1 Flash工程解析:低延迟、省显存、长上下文稳态落地

DeepSeek V4.1 Flash工程解析:低延迟、省显存、长上下文稳态落地

1. 项目概述&#xff1a;一场模型性能与工程落地的双重验证 “DeepSeek V4.1 Flash”这个名称一出现&#xff0c;我就立刻在几个主流AI模型评测平台翻了三遍日志——不是因为名字有多炫&#xff0c;而是它在OpenRouter实时排行榜上连续72小时稳居Top 1&#xff0c;且综合得分比…

2026/10/13 17:32:45 阅读更多 →
Django插画鲜花商城系统:从电商设计到全栈实现

Django插画鲜花商城系统:从电商设计到全栈实现

插画鲜花商城系统&#xff0c;听名字就能猜个大概——用户端是一个走插画视觉风格的花店商城&#xff0c;可以浏览花束、下单买花&#xff1b;管理端是常规的商品、订单、用户管理。这类项目在Django毕设里属于典型的"全栈电商平台"型题目&#xff0c;覆盖了用户认证…

2026/10/13 17:32:45 阅读更多 →
Spring Boot汽车销售服务管理系统:从数据库设计到前后端部署全解析

Spring Boot汽车销售服务管理系统:从数据库设计到前后端部署全解析

最近有不少同学在挑毕业设计题目&#xff0c;我的建议是别一上来就找那种花里胡哨的“人工智能区块链”标题&#xff0c;先问问自己&#xff1a;这系统我能不能完整讲清楚、能不能真正跑起来。汽车销售服务管理系统就是这么个经典选题——业务脉络清晰&#xff0c;技术栈主流&a…

2026/10/13 17:31:43 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →