HarmonyOS Repeat 状态串行怎么办:中式美食长列表 key、复用和行内状态怎么拆
📅 2026/7/24 11:05:35
👁️ 次浏览
问题先说清楚列表页最怕一种问题筛选前第二行是展开的筛选后展开状态跑到了别的行购物清单里只勾选了“鸡蛋”结果“番茄”也像被勾上了排序后卡片上的局部输入框还保留着上一条数据的草稿。这类问题看起来像 ArkUI 列表复用不稳定实际通常是三件事混在了一起列表项身份没有稳定下来key 用了 index多行数据共享了同一个对象引用行内临时 UI 状态和数据对象状态没有分层。Repeat能帮助列表复用但它不能替你判断哪一行到底是谁。身份错了复用越积极问题越明显。先区分三个状态状态类型放在哪里更合适典型例子数据对象状态数据模型里菜谱 id、名称、价格、是否收藏行内临时 UI 状态以稳定 id 建表保存展开、输入框草稿、临时高亮页面筛选状态页面或父组件里关键词、分类、排序、页码我一般不会把这些都塞进一个item里。item代表数据本身展开状态这种东西更多是“这一行在当前页面怎么显示”。如果把它和数据模型混在一起筛选、排序、缓存、复用之后就很难排查。案例一用 index 当 key筛选后状态跑到别的行先看问题写法Repeat(this.recipes).each((item:RecipeItem,index:number){RecipeRow({item:item})}).key((item:RecipeItem,index:number)index.toString())这段代码在静态列表里看不出问题。问题发生在列表会过滤、删除、排序的时候。假设原来有三行indexidnameexpanded0r-001宫保鸡丁false1r-002番茄牛腩true2r-003鱼香肉丝false这时删掉第一行r-002从 index 1 变成 index 0。框架看到 key 也变了就很难知道“原来展开的是 r-002而不是现在的第 1 个位置”。结果可能变成indexidnameexpanded0r-002番茄牛腩false1r-003鱼香肉丝true展开状态跑到了r-003上这就是典型的状态串行。更稳的写法是用稳定业务 idRepeat(this.recipes).each((item:RecipeItem){RecipeRow({item:item,expanded:this.expandedMap.get(item.id)??false,onToggle:()this.toggleExpanded(item.id)})}).key((item:RecipeItem)item.id)行内临时状态不要依赖 index而是用id - state保存StateexpandedMap:Mapstring,booleannewMap()toggleExpanded(id:string){constnextnewMap(this.expandedMap)next.set(id,!(next.get(id)??false))this.expandedMapnext}这里有一个细节我会新建一个Map再赋值而不是直接改旧Map。这样更容易让页面状态变化被识别也避免后面排查时搞不清楚引用有没有变。案例二多行共享同一个对象引用勾选状态一起变第二个问题更隐蔽。比如构造购物清单数据时为了省事写了一个默认对象constdefaultMeta:IngredientMeta{checked:false,note:}constrows:IngredientRow[]ingredients.map((item)({id:item.id,name:item.name,meta:defaultMeta}))这段代码的问题是每一行拿到的是同一个defaultMeta引用。你改第一行rows[0].meta.checkedtrue第二行也会受影响因为它们指向的是同一份对象。列表复用一参与进来表现就更像“组件把状态串了”。正确做法是每一行生成独立对象constrows:IngredientRow[]ingredients.map((item)({id:item.id,name:item.name,meta:{checked:false,note:}}))如果后面要让对象字段被观察再按状态管理 V2 的方式声明对象字段不要靠共享引用偷懒ObservedV2classIngredientMeta{Tracechecked:booleanfalseTracenote:string}constrowsingredients.map((item)({id:item.id,name:item.name,meta:newIngredientMeta()}))本地怎么验证我用脚本复现了两个问题。第一组验证 index keyconstshiftedcaseIndexKeyStateShift()conststablecaseStableKeyKeepsIdentity()console.log(shifted)console.log(stable)验证结果很直观用 index 当 key 时筛选后展开状态跑到了另一行用稳定 id 当 key 时展开状态还跟着原来的r-002。第二组验证对象引用constsharedcaseSharedObjectReference()constseparatedcaseSeparateObjectReference()console.log(shared)console.log(separated)共享对象时两行都会变成checkedtrue独立对象时只有第一行变化。我会怎么改列表代码我的处理顺序是先检查key所有会筛选、排序、删除、插入的列表都不要用 index 当 key。再检查对象引用默认对象、缓存对象、复制对象都要确认是不是同一份引用。把行内临时 UI 状态从数据对象里拆出来用稳定 id 管。数据对象字段确实需要被观察时再用ObservedV2和Trace。最后再看列表性能比如Repeat、组件复用、图片加载、分页加载。顺序不要反。先谈性能容易把身份问题掩盖掉先把身份和状态边界拆清楚再谈复用排查会简单很多。和组件冻结、同步刷新有什么区别这篇讲的是“这一行到底是谁”。组件冻结解决的是“不可见组件要不要参与刷新”同步刷新解决的是“这一批状态什么时候刷新给后续 UI 动作”。它们能配合但不能互相替代。如果 key 错了组件冻结救不了状态串行如果对象引用共享了applySync也只是更快地把错误刷新出来。列表问题先查身份再查刷新再查性能这个顺序更稳。验证记录本地验证脚本article105-repeat-key-reuse-demo.mjs验证通过点index key 场景能复现筛选后的展开状态错位稳定 id key 能保持行身份共享对象引用能复现多行勾选一起变化每行独立对象能隔离勾选状态。后续放到完整 ArkUI 页面里还可以补一轮真机截图把筛选前后每一行的展开状态和勾选状态截出来。这样读者不仅能看到代码也能看到问题发生和修复后的界面变化。
1. 项目背景与核心痛点去年接手公司客服系统改造项目时,我发现传统智能客服存在三个致命缺陷:机械式问答平均耗时2.4分钟/次、转人工率高达68%、问题重复率超过40%。某次抽查录音显示,用户询问"订单未出库"时,系统连续5…
📅 2026/7/24 11:05:35
惠州正宗陈皮去哪买:关注核心产区源与溯源体系许多生活在惠州的朋友常有这样的疑问:惠州正宗陈皮去哪买?面对市场上品牌众多、价格跨度大且外观难以辨别的现状,普通消费者往往感到无从下手。需要明确的是,本文旨在提供…
📅 2026/7/24 11:05:35
1. 项目背景与核心需求 在工业自动化领域,C#上位机与Python AI模型的跨语言整合已成为当前最实用的技术路线。我们团队在电子元器件检测、手机组装产线等场景中,验证了这种架构的可行性。核心需求可以归纳为三点: 实时性要求 :产…
📅 2026/7/24 11:04:34
“小程序制作平台有哪些”可以按交付方式分为标准化SaaS小程序、表单预约工具、可视化轻应用平台和源码定制开发。企业需要展示、预约、表单留资或营销入口时,通常先测试标准化SaaS;复杂接口、专属权限和完整源码需求则要单独立项。凡科杰建云通用小程序…
📅 2026/7/24 12:28:05
1. 项目概述:当FairyGUI遇上Unity打包 如果你正在用FairyGUI做Unity项目的UI,并且已经顺利地在编辑器里完成了所有华丽的界面设计,那么恭喜你,万里长征才走完了一半。接下来,将FairyGUI的UI资源包(也就是我…
📅 2026/7/24 12:28:05
1. 项目背景与核心价值在工业视觉检测领域,模板匹配技术一直是产线自动化中的关键环节。传统基于像素的匹配方法在光照变化、部分遮挡等复杂场景下表现欠佳,而基于外形的模板匹配技术因其对光照不敏感、抗干扰能力强等优势,正逐渐成为高精度定…
📅 2026/7/24 12:28:05
1. 项目概述:为什么需要深入理解DRA75P/DRA74P的外设接口?在嵌入式系统开发,尤其是汽车电子、工业网关这类复杂应用中,选型一颗处理器,看的远不止是主频和核心数量。真正决定项目成败、影响开发周期和系统稳定性的&…
📅 2026/7/24 12:28:05
做网站的平台可以按任务来选:基础展示需要页面与手机适配,内容获客需要文章、TDK、sitemap和表单,多语言业务还要考虑翻译、访问速度和资料维护,复杂系统则需要接口、权限或定制开发。凡科杰建云、Wix等标准化平台适合较快搭建企业…
📅 2026/7/24 12:28:05
我真的受够了。每次看到那些所谓的“技术大神”在论坛里吹嘘,说只要动动手指,就能让地图上的点位精准得像个强迫症患者的强迫症发作现场。呵,真是扯淡。我也曾是个愣头青,觉得这有什么难的?不就是改个坐标吗?直到上个月,我接了一个急单。客户是个做本地生活的小老板,急…
📅 2026/7/24 12:26:55
大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…
📅 2026/7/24 0:00:05
srcampy /libsrcampy 名称释义先明确结论: 官方文档没有公布标准化英文全称,是地平线内部项目缩写;行业公认拆解如下:srcampy Source Amplifier Python bindingsrc Source(图像源:MIPI Sensor、视频源&am…
📅 2026/7/24 0:01:06
该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…
📅 2026/7/24 0:01:06
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/24 1:07:52
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/24 1:07:52
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/24 1:07:52
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/24 7:08:08
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/23 17:07:28
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/24 5:08:03