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/8/3 20:08:15 阅读更多 →
管家婆软件能解决的具体经营问题

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

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

2026/8/3 21:05:53 阅读更多 →
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/8/4 2:34:52 阅读更多 →

最新新闻

重庆哪里可以找到专业的多媒体会议音视频系统工厂?

重庆哪里可以找到专业的多媒体会议音视频系统工厂?

在重庆&#xff0c;若想找到专业的多媒体会议音视频系统工厂&#xff0c;重庆优沃科技有限公司是不错的选择。该公司成立于2011年5月&#xff0c;坐落于重庆市九龙坡区石桥铺&#xff0c;是西南地区深耕多年的音视频系统集成与智能化弱电工程服务商。以下从几个方面详细介绍该公…

2026/8/4 16:36:33 阅读更多 →
靠谱的多媒体会议室音响厂商有哪些可以选择呢?

靠谱的多媒体会议室音响厂商有哪些可以选择呢?

靠谱的多媒体会议室音响厂商有不少&#xff0c;XULA音响就是其中之一&#xff0c;此外还有JBL、BOSE等品牌。以下为你详细介绍&#xff1a;XULA音响XULA音响是重庆优沃科技有限公司旗下的自有品牌。该公司自2011年成立以来&#xff0c;深耕音视频集成与智能化弱电赛道&#xff…

2026/8/4 16:36:33 阅读更多 →
【AI古风插画创作终极指南】:零基础3天掌握Stable Diffusion+ControlNet古风构图秘技

【AI古风插画创作终极指南】:零基础3天掌握Stable Diffusion+ControlNet古风构图秘技

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI古风插画创作的认知跃迁与技术全景 传统古风插画依赖深厚的人文积淀与手绘功底&#xff0c;而AI创作正推动一场静默却深刻的认知跃迁&#xff1a;从“技法复刻”转向“风格解构—语义重组—文化再生”的三层…

2026/8/4 16:36:33 阅读更多 →
Jmeter压测实战:Jmeter二次开发之自定义函数详解

Jmeter压测实战:Jmeter二次开发之自定义函数详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换…

2026/8/4 16:36:32 阅读更多 →
Unity WebGL AvproVideo视频卡顿:从编码到播放的全链路解决方案

Unity WebGL AvproVideo视频卡顿:从编码到播放的全链路解决方案

1. 问题现象与背景剖析最近在折腾一个Unity网页端项目&#xff0c;用AvproVideo插件&#xff08;版本2.6.3&#xff09;来播放首页的背景视频&#xff0c;结果遇到了一个挺典型的坑&#xff1a;视频文件明明已经加载完成了&#xff0c;进度条也走满了&#xff0c;但画面就是卡在…

2026/8/4 16:36:32 阅读更多 →
微信小程序健身房预约系统开发全解析

微信小程序健身房预约系统开发全解析

1. 项目概述&#xff1a;微信小程序健身房预约系统全解析 这套健身房预约系统是我为本地连锁健身中心开发的线上解决方案&#xff0c;上线三个月内帮助客户将预约率提升47%&#xff0c;会员留存率提高32%。系统采用微信小程序作为前端入口&#xff0c;后端基于Node.jsMySQL架构…

2026/8/4 16:35:32 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标&#xff1a;掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码&#xff1a;多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话&#xff0c;第一次听说美国这个老牌折扣网站的跨境卖家&#xff0c;十个有八个会问同一个问题&#xff1a;这个平台到底是干嘛的&#xff1f;我见过一个做家居出口的朋友&#xff0c;他在亚马逊上月销二十万美金&#xff0c;却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者&#xff1a;邓兵、刘建国通讯单位&#xff1a;清华大学DOI&#xff1a;https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素&#xff08;REEs&#xff09;是清洁能源技术与电子器件不可或缺的核心原料&#xff0c;然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流&#xff1a;一个核心问题的诞生想象一下&#xff0c;你是一个城市供水系统的总工程师。你的城市有多个水源&#xff08;水库&#xff09;&#xff0c;需要通过一个复杂的地下管道网络&#xff0c;将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →